2015-07-11 14 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;',但這樣做沒有意義。看來你不想覆蓋這個屬性,所以不要這樣做。 –