javascript - 在不丢失内存的情况下为每个实例创建和共享方法

标签 javascript prototype-programming

此代码只是示例。我试着理解 Object.create。

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

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

  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 对象? 我很困惑 :/ 请帮忙。

最佳答案

从外观上看,该方法仅在原型(prototype)上创建。 dog.__proto__.saySomething - 定义为在原型(prototype)上定义

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

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

关于javascript - 在不丢失内存的情况下为每个实例创建和共享方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40125788/

相关文章:

javascript - 状态未在 StrictMode 中更新

javascript - 在 React 组件构造函数中处理 promise 链

javascript - 以函数式、协变的方式使用 Array.prototype.map

javascript - 为什么在原型(prototype)中定义属性被认为是一种反模式

使用 "this = "的 Javascript 函数给出 "Invalid left-hand side in assignment"

javascript - 在Leaflet控件中使用NVD3图表

javascript - 为什么不能将链接切换为可见?

javascript - 当源自 API 并映射到变量时,React 图像不会呈现

javascript - 实例共享原型(prototype)方法以与私有(private)实例变量一起使用

javascript - Object.preventExtensions 实际上允许 __proto__ 的突变?