关于JavaScript中的原型概念

时间:2014-01-08 16:10:21

标签: javascript prototypal-inheritance

在下面的代码中,我有一个名为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); 
        };
    };

2 个答案:

答案 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>