访问继承的修改对象的原始属性

Accessing the original property of an inherited modified object

本文关键字:原始 属性 对象 修改 继承 访问      更新时间:2023-09-26

《Javascript The Definitive Guide》中的继承阅读

如果[一个对象]先前继承了属性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 ?

你可以这样做:

delete p.x;

你也可以这样做:

p.constructor.prototype.x;

,但这不是特别健壮,因为构造函数属性是可写的,并且如果对象是使用object构造的。创建时,它的构造函数是Object函数,它的原型不是p的原型。即使它引用了一个对象,它的prototype属性也可能不是你要找的对象。

你也可以这样做:

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