2013-03-06 2 views
0

чтения для наследования в «Javascript The Definitive Guide» Я прочиталДоступа к исходному свойству унаследованного модифицированного объекта

Если [объект] ранее унаследовал свойство х, что унаследованное свойство теперь скрыто вновь создал собственную собственность с тем же именем.

Я создал пример, чтобы лучше понять его

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} 

В этом случае, возможно по любой причине, чтобы получить доступ к свойству x со значением 1?

ответ

1

Вы можете сделать:

delete p.x; 

Вы также могли бы быть в состоянии сделать:

p.constructor.prototype.x; 

, но это не особенно надежен, как свойство конструктор доступен для записи и, если объект строится с помощью объекта .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