从new转换为Object.create()

时间:2015-01-08 15:18:06

标签: javascript

我最近发现了关于newObject.create()的整个辩论。来自new的大量OO,我已经学会了如何解决问题的某些模式。为了学习不同的东西,我想我会改写一些简单的经典OO"代码为Object.create()样式。

我遇到了嵌套对象的问题,例如



   
function Base() {
  this.name = { first: '', last: '' };
}

var a = new Base();
var b = new Base();

a.name.first = 'Sally';
a.name.last = 'Broker';

b.name.first = 'Peter';
b.name.last = 'Davis';

document.write('first:', a.name.first, " last:", a.name.last);  // Outputs { first: 'Sally', last: 'Broker' }
document.write("<br>");
document.write('first:', b.name.first, " last:", b.name.last);  // Outputs { first: 'Peter', last: 'Davis' }
&#13;
&#13;
&#13;

的Object.create()

&#13;
&#13;
var base = {
  name: {
    first: '',
    last: ''
  }
};

var a = Object.create(base);
var b = Object.create(base);

a.name.first = 'Sally';
a.name.last = 'Broker';

b.name.first = 'Peter';
b.name.last = 'Davis';

document.write('first:', a.name.first, " last:", a.name.last);  // Outputs { first: 'Sally', last: 'Broker' }
document.write("<br>");
document.write('first:', b.name.first, " last:", b.name.last);  // Outputs { first: 'Peter', last: 'Davis' }
&#13;
&#13;
&#13;

我理解为什么嵌套对象的赋值不起作用,而且我的想法是基于&#34;经典OO&#34;中使用的编码模式。我试图了解我应该如何思考,设计明智,攻击我已经去过嵌套对象的东西,但是在Object.create()的最佳实践方面。

1 个答案:

答案 0 :(得分:3)

这两个版本不相同。在new的情况下,您将“name”属性直接放在构造的实例上。当你像这样使用Object.create()时,你没有这样做 - 你期望从原型继承“name”。因此,对“名称”对象的属性的后续分配会影响共享原型版本。 (换句话说,a.nameb.name都指的是完全相同的对象。)

要使用new创建Object.create()方案的大致等效版本,您可以执行以下操作:

var a = Object.create(Object.prototype, {
  name: {
    value: { first: "John", last: "Doe" },
    writable: true,
    enumerable: true
  }
});

或者更简单:

var a = Object.create(Object.prototype);
a.name = { first: "John", last: "Doe" };