gpt4 book ai didi

javascript - 从 new 过渡到 Object.create()

转载 作者:行者123 更新时间:2023-11-30 12:30:35 25 4
gpt4 key购买 nike

我最近发现了关于 newObject.create() 的整个争论。通过使用 new 进行大量面向对象的工作,我学会了解决问题的特定模式。为了学习不同的东西,我想我应该将一些简单的“经典 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' }

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' }

我理解为什么对嵌套对象的赋值不一样,而且我的想法是基于“经典 OO”中使用的编码模式。我正在尝试学习我应该如何思考,设计明智,当攻击我已经为嵌套对象而去的东西时,但在 Object.create() 的最佳实践方面。

最佳答案

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

要使用 Object.create() 创建一个与 new 场景大致相同的版本,您需要执行如下操作:

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" };

关于javascript - 从 new 过渡到 Object.create(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27843436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com