每个实例的Object.create和share方法,不会丢失内存

时间:2016-10-19 08:17:44

标签: javascript prototype-programming

此代码仅为示例。我试着理解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 个答案:

答案 0 :(得分:1)

从外观上看,该方法仅在原型上创建。 dog.__proto__.saySomething - 已定义,因此它在原型

上定义

要仔细检查dog.hasOwnProperty('saySomething'),则返回false,表示该属性不可枚举或在原型上定义。

如果你想向cat或dog添加方法,并确保只创建了一个属性副本,你可以将它们添加到实例中,然后在实例上调用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