有几种方法可以在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 + ...); }
}
出于各种原因,后者更快,但我已经看到(我经常写)原型版本,并对其他人的行为感到好奇。
答案 0 :(得分:9)
为原型分配函数更好(对于公共方法),因为该类的所有实例将共享该方法的相同副本。如果在构造函数内部分配函数,如第二个示例所示,则每次创建新实例时,构造函数都会创建length函数的新副本,并将其分配给该实例。
然而,如果希望每个副本拥有它自己的副本,后一种技术很有用,主要用于执行私有/特权方法,这些方法可以访问构造函数内部声明的私有变量,通过闭包机制继承。
道格拉斯·克罗克福德有一个很好的summary。答案 1 :(得分:4)
还有原型的对象文字方法:
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);
答案 2 :(得分:3)
幸运的是我开始使用prototype.js,它提供了一些不错的包装器。所以你可以这样做:
var Person = Class.create({
initialize: function(name) {
this.name = name;
},
say: function(message) {
return this.name + ': ' + message;
}
});
Prototype.js
Documentation: Defining classes and inheritance
答案 3 :(得分:2)
好吧,我对此没有真正的专家意见。 我通常最终使用基于闭包的方法,因为它使代码更容易管理。但是,我发现自己将原型用于具有大量代码行的方法。
答案 4 :(得分:2)
您还可以选择:
function Vector(x, y, z) {
function length() {
return Math.sqrt(x * x + ...);
}
}
这可能与示例二一样慢,但它看起来更像Java / C#并且更加明确。
答案 5 :(得分:1)
我非常喜欢使用John Resig's library。轻巧,直接,如果您熟悉“通常的”面向对象风格,您已经知道如何使用它。
答案 6 :(得分:1)
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';
}
}