gpt4 book ai didi

javascript - Crockford 的原型(prototype)继承 - 嵌套对象的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:42:23 24 4
gpt4 key购买 nike

我一直在阅读道格拉斯·克罗克福德 (Douglas Crockford) 的“Javascript:好的部分”——虽然它有点极端,但我同意他所说的很多内容。

在第 3 章中,他讨论了对象,并在某一点提出了一种模式(也是 found here),用于简化和避免使用内置“new”关键字带来的一些混淆/问题。

if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
newObject = Object.create(oldObject);

所以我尝试在我正在处理的项目中使用它,并且在尝试从嵌套的对象继承时我注意到了一个问题。如果我覆盖使用此模式继承的嵌套对象的值,它会一直覆盖原型(prototype)链上的嵌套元素。

Crockford 的例子就像下面例子中的flatObj,效果很好。但是,该行为与嵌套对象不一致:

var flatObj = {
firstname: "John",
lastname: "Doe",
age: 23
}
var person1 = Object.create(flatObj);

var nestObj = {
sex: "female",
info: {
firstname: "Jane",
lastname: "Dough",
age: 32
}
}
var person2 = Object.create(nestObj);

var nestObj2 = {
sex: "male",
info: {
firstname: "Arnold",
lastname: "Schwarzenneger",
age: 61
}
}
var person3 = {
sex: "male"
}
person3.info = Object.create(nestObj2.info);

// now change the objects:
person1.age = 69;
person2.info.age = 96;
person3.info.age = 0;

// prototypes should not have changed:
flatObj.age // 23
nestObj.info.age // 96 ???
nestObj2.info.age // 61

// now delete properties:
delete person1.age;
delete person2.info.age;
delete person3.info.age;

// prototypes should not have changed:
flatObj.age // 23
nestObj.info.age // undefined ???
nestObj2.info.age // 61

(也在 fiddle 上)

我做错了什么,还是这种模式的局限性?

最佳答案

没有矛盾。只是不要考虑嵌套对象:对象的直接 属性总是在其原型(prototype)或自己的属性上。属性值是原始值还是对象都无关紧要。

所以,当你这样做的时候

var parent = {
x: {a:0}
};
var child = Object.create(parent);

child.x 将引用与 parent.x 相同的对象 - 即一个 {a:0} 对象。当您更改它的属性时:

var prop_val = child.x; // == parent.x
prop_val.a = 1;

两者都会受到影响。要独立更改“嵌套”属性,您首先必须创建一个独立对象:

child.x = {a:0};
child.x.a = 1;
parent.x.a; // still 0

你能做的是

child.x = Object.create(parent.x);
child.x.a = 1;
delete child.x.a; // (child.x).a == 0, because child.x inherits from parent.x
delete child.x; // (child).x.a == 0, because child inherits from parent

这意味着它们不是绝对独立的 - 但仍然是两个不同的对象。

关于javascript - Crockford 的原型(prototype)继承 - 嵌套对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33459777/

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