2015-07-11 37 views
1

我有以下代码javascript对象继承是如何工作的?

var createObj = function (prop1, prop2) { 
    var obj = { 
     prop1: prop1, 
     prop2: prop2 
    } 
    Object.defineProperty(obj, "prop3", { 
     get: function() { 
      return this.prop1 + ' ' + this.prop2; 
     }, 
     configurable: true 
    }); 
    return obj; 
} 

var createSecObj = function() { 
    var obj = createObj("prop1", "prop2"); 
    var prop3 = obj.prop3; 

    Object.defineProperty(obj, "prop3", { 
     get: function() { 
      return prop3; 
     } 
    }); 
    return obj; 
} 

我想学习如何Javascript继承工作。

比方说作为

myObj = createSecObj(); 

然后myObj.prop3的值被记录到控制台

console.log(myObj.prop3) // "prop1 prop2" 

创建一个名为MyObj中的对象,然后myObj.prop1变更为“嗒嗒”使用

myObj.prop1 = "blah" 

再次,如果myObj.prop3记录到控制台,它会导致“prop1 prop2”。而不是“blah prop2”。

console.log(myObj.prop3) // results "prop1 prop2", expecting "blah prop2" 

看起来像obj.prop3仍然引用其父对象。这甚至是什么原因被重新定义在子对象中。有人可以请详细解释一下吗?

回答

4

看起来像obj.prop3仍然引用其父对象。这甚至是什么原因被重新定义在子对象中。

该问题与继承无关。问题是,你改写prop3

var prop3 = obj.prop3; // var prop3 = "prop1 prop2"; 

Object.defineProperty(obj, "prop3", { 
    get: function() { 
     return prop3; // will always return "prop1 prop2" 
    } 
}); 

obj.prop3总是返回的变量prop3值。变量prop3的值在整个应用程序中无法更改,并且在创建时它的值为"prop1 prop2"

我不清楚你在这里想达到什么,所以我不能真正提出解决方案。如果你想获得"blah prop2",那么只需从你的代码中删除上述行。

+0

谢谢你的回答:)我想重新使用代码createObj,prop3而不重写它作为返回this.prop1 +''+ this.prop2;内部createSecObj.prop3 getter。请考虑这是为了学习的目的。不适用于生产级别的应用:)只想检查事情如何完成:)请原谅我的糟糕英语。 –

+1

如果你只是想引用继承的prop3属性,你可以写'return Object.getPrototypeOf(this).prop3;',但这样做没有意义。看来你不想覆盖这个属性,所以不要这样做。 –