我已经阅读了关于 Object.create 的 MDN 文档。它只指出了第一个参数是原型时的场景。但是,我在 Node.js 中看到了一些这样的代码:
var events = require('events');
var emitter = new events.EventEmitter();
var a = Object.create(emitter);
那么Object.create()
当它的第一个参数是一个对象时会做什么呢?
我已经阅读了关于 Object.create 的 MDN 文档。它只指出了第一个参数是原型时的场景。但是,我在 Node.js 中看到了一些这样的代码:
var events = require('events');
var emitter = new events.EventEmitter();
var a = Object.create(emitter);
那么Object.create()
当它的第一个参数是一个对象时会做什么呢?
的第一个参数Object.create
始终是原型,它始终是一个对象。
在这种情况下,它只是意味着原型恰好是通过创建的new
——没什么大不了的。如果new
确实(应该)返回一个新对象,则将其视为一次性(或“非共享”)原型,仅用于新的 Object.create'd 对象。
根据标准规则,由 建立的 Object.create 原型的 [prototype]new
也将成为链的一部分。
Object.create(proto [, propertiesObject ])
proto
-应该是新创建对象的原型的对象。
使用 Object.createnew
创建多个实例可能会导致问题。使用new
创建一个可以(并且很可能)具有实例特定成员的对象。如果您随后使用该对象创建多个实例,您将在新创建的对象的原型上拥有实例特定成员。原型是共享的,对这些成员进行变异将使其在所有实例中发生变异。如下例以食品会员为例进行说明。
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"]