我最近发现了关于new
与Object.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;
的Object.create()
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;
我理解为什么嵌套对象的赋值不起作用,而且我的想法是基于&#34;经典OO&#34;中使用的编码模式。我试图了解我应该如何思考,设计明智,攻击我已经去过嵌套对象的东西,但是在Object.create()
的最佳实践方面。
答案 0 :(得分:3)
这两个版本不相同。在new
的情况下,您将“name”属性直接放在构造的实例上。当你像这样使用Object.create()
时,你没有这样做 - 你期望从原型继承“name”。因此,对“名称”对象的属性的后续分配会影响共享原型版本。 (换句话说,a.name
和b.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" };