我正在阅读Crockford's book on Javascript并尝试其继承方法“Beget”,但我对结果感到困惑。
您能否解释一下为什么以下代码返回“Values: blue_small/blue_big”?我希望它返回“值:blue_small/red_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";
}
最佳答案
在 Javascript 中,当实例未设置某个属性的值时,获取该值会引用原型(prototype)链。
在此示例中,创建了 object2
,object1
是其原型(prototype)。但是 color
属性的值永远不会以显式方式设置在 object2
上。
这意味着读取的值引用了原型(prototype) object1
,并且由于那里的值设置为 blue
,因此您得到了结果。
您的困惑可能源于这样一个事实:您希望创建新对象来创建包含所有属性的副本。然而事实上,新创建的对象没有以显式方式设置属性。每当您获取属性的值时,都会引用原型(prototype)链。
关于Javascript原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22884937/