在下面的代码中,我有一个名为Foo的类,我添加了一个名为data的原型,它是一个数组,我在类中添加了一个名为showData的函数作为原型。
var Foo = function (name)
{
this.name = name;
};
Foo.prototype.data = [1, 2, 3]; // setting a non-primitive property
Foo.prototype.showData = function ()
{
console.log(this.name, this.data);
};
问题是,如果我将Foo类中的数据和showData定义为:
,会有区别吗? var Foo = function (name)
{
this.name = name;
this.data = [1, 2, 3];
this.showData = function ()
{
console.log(this.name, this.data);
};
};
答案 0 :(得分:4)
是的,有一个重大区别。
在第一种情况下,data
数组由Foo
的所有实例共享。因此,如果您修改一个实例的属性,则会修改所有实例:
var f1 = new Foo(),
f2 = new Foo();
f2.data[2] = 4; // also changes f1.data
由于这种共享,它也消耗更少的内存,但如果你创建了许多Foo
的实例,那可能不是你的问题(请注意,在JS中,通常在基于gc的语言中消耗内存,不仅不好因为内存消耗但是因为CPU用来垃圾而已。)
但是将属性设置为prototype
非常棘手,因为搜索始终从最奇怪的元素开始:如果设置f2.data = [1,2,4]
,则更改f2.data
但不更改{{} 1}}(这会生成2个不同的数组)。
答案 1 :(得分:1)
主要区别在于,通过向原型添加属性,您可以将它们添加到Foo
的所有实例中,甚至是已经创建的实例。
您的第二个版本还涉及执行那些额外的代码行每次实例化new Foo
,这可能是巨大的量的开销。< / p>