【问题标题】:What does it mean to call Object.create(new EventEmitter) in Node.js在 Node.js 中调用 Object.create(new EventEmitter) 是什么意思
【发布时间】:2014-03-11 13:12:18
【问题描述】:

我读过MDN document on Object.create。 它只指出了第一个参数是原型时的场景。但是,我在 Node.js 中看到过一些这样的代码:

var events = require('events');  
var emitter = new events.EventEmitter();  
var a = Object.create(emitter);

那么当Object.create() 的第一个参数是一个对象时,它会做什么呢?

【问题讨论】:

  • 所有原型都是对象。没有区别 - 它只是做同样的事情。
  • 那么a和emitter是什么关系呢?它们彼此不同吗?我试图让发射器监听名为 'hello' 的事件并让 a 发出 'hello' 事件,发射器可以捕获它。
  • @LASkuma 与 any 原型的关系相同。那么“问题”就是“new events.EventEmitter() 返回什么?”这与这里要求的不同。
  • @user2864740 这有点令人困惑。你的意思是“a”属于 EventEmitter 的子类,因为发射器是 EventEmitter 类的一个实例?
  • 不,它一个指向emitter的指针。它是一个新的、不同的对象,并且可以有自己的属性(隐藏继承的属性)。

标签: javascript node.js object-create


【解决方案1】:

使用 Object.create 和 new 创建多个实例可能会导致问题。使用new 创建一个可以(并且很可能)具有实例特定成员的对象。如果您随后使用该对象创建多个实例,您将在新创建的对象的原型上拥有特定于实例的成员。原型是共享的,对这些成员进行变异将在所有实例中对其进行变异。如下例所示,以 food 成员为例。

var Person = function(){
  this.food=[];//every person has food
      // this should be instance specific
};
Person.prototype.eat = function(foodItem){
  this.food.push(foodItem);
};
var proto = Object.create(new Person());
var bob = Object.create(proto);
var ben = Object.create(proto);
bob.eat("Eggs");
console.log(ben.food);//=["Eggs"]

【讨论】:

    【解决方案2】:

    Object.create 的第一个参数是 always 原型,它always 是一个对象。

    在这种情况下,它只是意味着原型恰好是通过new 创建的——没什么大不了的。如果new 确实(应该)返回一个 new 对象,那么将其视为一个一次性(或“非共享”)原型,它只会被使用对于新的 Object.create'd 对象。

    根据标准规则,由new 建立的 Object.create 原型的 [prototype] 也将成为链的一部分。

    Object.create on MDN:

    Object.create(proto [, propertiesObject ])

    proto - object 应该是新创建对象的原型。

    【讨论】:

    • 正如我所提到的,我已经阅读了该文档。你能试试我在你的节点 repl 中引用的代码吗?它确实以某种方式起作用,我只是想弄清楚发生了什么。
    • @LASkuma 只有一种情况。原型是一个对象。如果它是new'd(并且没有完成return sharedInstance finagling),那么它只是一个一次性(或“非共享”)原型对象 - object 也可以通过一个新的{} 表达式,或者它可以隐藏在构造函数后面(正常应用它自己的[原型]),就像这种情况一样。 所有规则都没有改变。
    猜你喜欢
    • 2011-01-24
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2011-07-12
    • 2015-03-21
    相关资源
    最近更新 更多