Javascript原型(prototype)继承

标签 javascript

我正在阅读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)链。

在此示例中,创建了 object2object1 是其原型(prototype)。但是 color 属性的值永远不会以显式方式设置在 object2 上。

这意味着读取的值引用了原型(prototype) object1,并且由于那里的值设置为 blue,因此您得到了结果。

您的困惑可能源于这样一个事实:您希望创建新对象来创建包含所有属性的副本。然而事实上,新创建的对象没有以显式方式设置属性。每当您获取属性的值时,都会引用原型(prototype)链。

关于Javascript原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22884937/

相关文章:

javascript - 为什么当用户关闭 chrome 中的选项卡时弹出?

javascript - 在 Javascript 数组中排列一个重复对象以生成一个值

javascript - 更新 api 调用 React 中的设置状态

javascript - JS - 迭代对象并更改其属性值?

javascript - JavaScript 数学运算中的 NAN 和 Infinity

javascript - 将通用 img 放入响应式 div

javascript - 如何在本地浏览器中存储数据并从中检索数据

javascript - try/catch 的替代方法,用于检查 javascript 中是否存在函数

javascript - 如何阻止内容脚本自行启动

javascript - jQuery UI 可排序 - 重叠 50% 似乎不起作用