2014-01-08 130 views
1

在下面的代码中,我有一个名为Foo的类,我添加了一个名为data的原型,它是一个数组,我添加了一个名为showData的函数作为类的原型。关于JavaScript中的原型概念

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); 
}; 

的问题是,是否有区别,如果我定义数据和showData Foo类里面为:

var Foo = function (name) 
    { 
     this.name = name; 
     this.data = [1, 2, 3]; 
     this.showData = function() 
     { 
      console.log(this.name, this.data); 
     }; 
    }; 
+0

'console.log(Foo)'并比较差异! :) – Phil

回答

4

是的,有一个重大的区别。

在第一种情况下,data阵列由Foo的所有实例共享。所以,如果你修改一个实例的属性,所有被修改:

var f1 = new Foo(), 
    f2 = new Foo(); 
f2.data[2] = 4; // also changes f1.data 

它也消耗更少的内存,由于这种共享,但是这可能不是你的关心,如果除了您创建的Foo很多情况下(注意,在JS,就像在使用gc的语言中经常使用内存一样,不仅因为内存消耗而损坏,而且因为CPU被用于垃圾回收)。

但属性设置为prototype是棘手的,因为搜索总是从childest元素开始:如果设置f2.data = [1,2,4],那么你改变f2.data但你不改变f1.data(这将产生2个不同的阵列)。

1

主要区别在于,通过向原型添加属性,即可将它们添加到Foo的所有实例,即使是已创建的实例。

你的第二版本还包括执行的每一个new Foo被实例化时间码那些附加线,其可以是开销的一个潜在的巨大