2013-03-06 52 views
0

解讀爲「使用Javascript權威指南」傳承的原物業我讀訪問繼承修改的對象

如果[對象]以前繼承的財產X,即繼承屬性現在被新藏用相同的名字創建自己的財產。

我創建了一個例子,以更好地理解它

var o = {x:1}; 
var p = Object.create(o); 
p.x = 5; 
console.log(p.x); //5 
console.log(p); //Object {x: 5, x: 1} 

在這種情況下,是否有可能以任何理由與價值1訪問屬性x

回答

1

你可以這樣做:

delete p.x; 

您可能還能夠做到:

p.constructor.prototype.x; 

,但不是特別強勁的constructor屬性是可寫的,如果對象是使用對象構造.create,它的構造函數是Object函數,它的原型不是p的原型。即使它引用了一個對象,其原型屬性也可能不是你所尋找的對象。

你也可以這樣做:

p.__proto__.x; 

但這是非標準的,在所有的瀏覽器不支持的__proto__未來似乎還是個未知數。

因此,也許最好這樣做:

if (p.hasOwnProperty('x')) { 
    var x = p.x; 
    delete p.x; 
    var x2 = p.x; 
    p.x = x; 
} 

但請注意,這可能會影響性能從for..in循環返回的順序排列,如果這是重要的(它不應該是因爲訂單無法保證,瀏覽器之間也不一致,但這使得它更有可能不同)。 p.x