我正在阅读Crockford's book on Javascript并尝试继承方法" Beget",但我对结果感到困惑。
你能解释为什么下面的代码返回"值:blue_small / 蓝色 _big"?我希望它会返回"值:blue_small / 红色 _big"。
if (typeof Object.beget !== 'function') {
Object.beget = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
function calculate(){
var object1 = {
color: "red",
size: "small"
};
var object2 = Object.beget(object1);
object2.size = "big";
object1.color = "blue";
return "Values: "+object1.color +"_" + object1.size +" \/ " + object2.color+"_" + object2.size || "unknown";
}
答案 0 :(得分:2)
在Javascript中,当一个属性的值而不是在实例上设置时,获取该值会引用原型链。
在此示例中,object2
已创建,object1
是其原型。但color
属性的值永远不会在object2
上以明确的方式设置。
这意味着读取值是指object1
的原型,并且由于值设置为blue
,因此您可以获得结果。
您的困惑可能源于您希望创建新对象以创建包含所有属性的副本这一事实。但实际上,新创建的对象没有以显式方式设置属性。只要您获得属性的值,就会引用原型链。
答案 1 :(得分:1)
您的object2继承自您的object1。
object1 = { color: "red", size: "small" };
=>对象1 =红色/小
var object2 = Object.beget(object1);
=>对象2 =红色/小
object2.size = "big";
=>对象2 =红色/大
object1.color = "blue";
=>对象1 =蓝色/小和对象2 =蓝色/大
因为你从未改变过对象2的颜色,所以它会从对象1获得颜色,对象1是它的父亲。因此,当您更改对象1时,对象2将自动更新此属性。如果您在任何时候更改了对象2颜色,那么它将绕过继承。
答案 2 :(得分:0)
因为beget
没有创建object1
的副本,但是创建了一个新的空 object2
从继承 object1
。此继承是动态的,当您更改object1
时,object2
上也会显示该新属性值。