之间有什么区别
var A = function () {
this.x = function () {
//do something
};
};
和
var A = function () { };
A.prototype.x = function () {
//do something
};
之间有什么区别
var A = function () {
this.x = function () {
//do something
};
};
和
var A = function () { };
A.prototype.x = function () {
//do something
};
考虑一下静态类型的语言,事物prototype
是静态的,事物this
是与实例相关的。
我相信@Matthew Crumley是正确的。它们在功能上(如果不是在结构上)是等效的。如果您使用Firebug查看使用创建的对象,则new
可以看到它们是相同的。但是,我的偏好如下。我猜想这似乎更像是我在C#/ Java中所习惯的。即,定义类,定义字段,构造函数和方法。
var A = function() {};
A.prototype = {
_instance_var: 0,
initialize: function(v) { this._instance_var = v; },
x: function() { alert(this._instance_var); }
};
编辑并不是要暗示变量的范围是私有的,我只是想说明如何在javascript中定义类。变量名称已更改以反映这一点。
原型是该类的模板;这适用于它的所有未来实例。而这是对象的特定实例。
第一个示例仅更改该对象的接口。第二个示例更改该类所有对象的接口。
在大多数情况下,它们本质上是相同的,但是第二个版本可以节省内存,因为该函数只有一个实例,而不是每个对象都有单独的函数。
使用第一种形式的原因是访问“私人成员”。例如:
var A = function () {
var private_var = ...;
this.x = function () {
return private_var;
};
this.setX = function (new_x) {
private_var = new_x;
};
};
由于javascript的范围规则,private_var可用于分配给this.x的函数,但不适用于该对象。
正如在其他答案中所讨论的那样,这实际上是性能方面的考虑,因为原型中的函数与所有实例共享-而不是为每个实例创建的函数。
我整理了一个jsperf来展示这一点。实例化类的时间有很大的不同,尽管实际上只有在创建多个实例时才有意义。
http://jsperf.com/functions-in-constructor-vs-prototype