2011-05-06 139 views
44

按照我的代码,
苹果是通过原型定义功能。
香蕉按类属性定义函数。按原型定义函数和类属性有什么区别?

var Apple = function(){} 
Apple.prototype.say = function(){ 
    console.debug('HelloWorld'); 
} 
var Banana = function(){ 
    this.say = function(){ 
     console.debug('HelloWorld'); 
    } 
} 

var a = new Apple(); 
var b = new Banana(); 

a.say(); 
b.say(); 

这些不同吗?

回答

65

当您创建Apple的多个实例时,内存中仍将只有一个say()实例。但是,当您创建多个香蕉实例时,最终会创建大量的say()函数实例。

这就是为什么原型可以节省内存。您还可以避免创建和分配say()函数的处理成本。另外,如果您更改父对象的属性,如果该子项不替换该属性,则可以从该子项中看到更改。

+5

此外,所有实例都会“看到”原型的更改,这在某些情况下可能会有用。 – 2011-05-06 14:12:36

+5

是的,这在某种意义上相当于静态。 – 2011-05-06 14:16:21

+0

我也想知道继承,所以我做了一个小提琴。结果:两种方式都有效。 https://jsfiddle.net/jdhenckel/tfn71a96/ – 2016-07-08 14:39:25

2

原型成员就像类成员类成员就像类成员,而当你用另一种方式定义它,而不是类成员。所以如果你创造了很多苹果的对象,所有的都将共享相同的功能,而在香蕉的情况下,每个对象都会有自己的功能副本。 在JavaScript中将原型想象为静态的C#。

相关问题