Javascript原型继承

时间:2014-04-05 18:25:52

标签: javascript

我正在阅读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";
}

3 个答案:

答案 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上也会显示该新属性值。