2016-10-19 18 views
2

此代码仅为示例。我试图理解Object.create。Object.create并为每个实例共享方法而不会丢失内存

function Animal {} 
var cat = new Animal(); 

我想创建100个动物,并添加到构造函数的一些方法,例如saySomething()。所以,我把它添加到原型,我知道我的方法将被创建只有一次,每个实例访问它:

Animal.prototype.saySomething = function(voice) { 
     console.log(voice) 
    } 

但是,当我创建这样的对象:

var Animal = { 
    saySomething: function(voice) { 
     console.log(voice) 
    } 
} 

var cat = Object.create(Animal); 
var dog = Object.create(Animal); 
... 

当我创建这样的对象,saySomething方法分别为每个实例创建? 如何将这种方法添加到Animal对象中,方法与之前相同? 我很困惑:/ 请帮忙。

回答

1

从外观上看,该方法只在原型上创建。 dog.__proto__.saySomething - 被定义为在原型上定义的

要进行双重检查dog.hasOwnProperty('saySomething')返回false,表明该属性不是可枚举的或在原型上定义。

如果您想要为猫或狗添加方法并确保只创建一个属性副本,您可以将它们添加到实例然后在实例上调用Object.create。

var Animal = { 
    saySomething: function(voice) { 
     console.log(voice) 
    } 
} 

var cat = Object.create(Animal); 
var dog = Object.create(Animal); 
cat.saySomething = function(){ 
    console.log('meow') 
}; 
var catInstance = Object.create(cat); 
catInstance.saySomething(); // 'meow' 
typeof catInstance.__proto__.saySomething == "function" // true 
+0

好的,谢谢:)真棒:) – Agata