有几种方法可以在 javascript 中获得类似类的行为,最常见的似乎是基于原型的,如下所示:
function Vector(x, y, x) {
this.x = x;
this.y = y;
this.z = z;
return this;
}
Vector.prototype.length = function () { return Math.sqrt(this.x * this.x ... ); }
和基于闭包的方法类似于
function Vector(x, y, z) {
this.length = function() { return Math.sqrt(x * x + ...); }
}
由于各种原因,后者更快,但我已经看到(并且我经常写)原型版本并且对其他人的工作感到好奇。
将函数分配给原型更好(对于公共方法),因为该类的所有实例将共享该方法的相同副本。如果像第二个示例那样在构造函数内部分配函数,则每次创建新实例时,构造函数都会创建长度函数的新副本并将其分配给该实例。
但是,如果您希望每个副本都有自己的副本,后一种技术很有用,主要用途是执行私有/特权方法,这些方法可以访问在构造函数中声明并通过闭包机制继承的私有变量。
Douglas Crockford 有一个很好的总结。
还有原型的对象文字方法:
var Vector = function(){};
Vector.prototype = {
init:function(x,y,z) {
this.x = x;
this.y = y;
this.z = z;
},
length:function() {
return Math.sqrt(x * x + ...);
}
};
var v1 = new Vector();
v1.init(1,2,3);
幸运的是,我开始使用prototype.js,它提供了一些不错的包装器。所以你可以这样做:
var Person = Class.create({
initialize: function(name) {
this.name = name;
},
say: function(message) {
return this.name + ': ' + message;
}
});
Prototype.js文档:定义类和继承
好吧,我对此真的没有专家意见。我通常最终使用基于闭包的方法只是因为它使代码更易于管理。但是,我发现自己使用原型来处理包含大量代码行的方法。
您还可以选择:
function Vector(x, y, z) {
function length() {
return Math.sqrt(x * x + ...);
}
}
这可能与示例 2 一样慢,但它看起来更像 Java/C#,并且更明确一些。
为此,我非常喜欢使用John Resig 的库。轻巧、直接,如果您熟悉“通常”的面向对象风格,您就已经知道如何使用它。
javascript 中没有类。
但是有对象。你不需要一个类来在 javascript 中创建一个对象。它确实具有可以使用 new 调用的构造函数,例如:
var james = new Person();
您可以通过以下方式模拟类似类的行为:
原型示例:
function Car (type) {
this.type = type;
this.color = "red";
}
Car.prototype.getInfo = function() {
return this.color + ' ' + this.type + ' car';
};
对象文字示例
var car = {
type: "honda",
color: "red",
getInfo: function () {
return this.color + ' ' + this.type + ' car';
}
}
我的测试表明基于闭包的方法速度较慢。您必须为每个对象实例化一个单独的闭包。原型方法与所有实例共享方法。
如果你从其他东西继承,你不能设置文字原型对象,这会覆盖以前的原型