题
有几种方法获取的类似行为在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 + ...); }
}
由于各种原因后者是更快,但我已经看到(我经常做的编写)的原型版本并且很好奇为什么其他人做的。
解决方案
分配的功能原型是更好的(公共的方法),因为所有类的实例将分享相同的复制的方法。如果分配的功能的内部构造作为在第二个例子中,每一次创建一个新的实例,构造创建一个新的复制的长度的功能,并将其分配给只是一个实例。
但是这后一种技术是非常有用的,如果你 想 每个复制有它自己的复制,主要使用的,正在做私人/权限的方法,其中有访问专声明的变量内部构造和继承通过封闭的机构。
道格拉斯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;
}
});
嗯,我真的没有一个专家意见这一点。我通常的最终使用的封锁基础的方法,只是因为它保留的代码的更简单的管理。但是,我们发现自己使用的原型的方法载的行代码。
你还有的选择:
function Vector(x, y, z) {
function length() {
return Math.sqrt(x * x + ...);
}
}
这可能只是作为缓慢的,因为例子中的两个,但是它看起来更像Java/C#以及一位更加明确。
我是个大风扇使用 约翰Resig的图书馆 这一点。轻便、直接的,你已经知道如何使用它,如果你熟悉的'通常的'面向对象的风格。
有没有类javascript。
有的对象。你不需要一个类创造一个对象在javascript。它不会有constuctor功能,可以调用与新例如:
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';
}
}
不隶属于 StackOverflow