2012-04-12 6 views
0

Ниже код взят из http://bonsaiden.github.com/JavaScript-Garden/Javascript прототип Наследование

function Foo() { 
    this.value = 42; 
} 
Foo.prototype = { 
    method: function() {} 
}; 

function Bar() {} 

// Set Bar's prototype to a new instance of Foo 
Bar.prototype = new Foo(); 
Bar.prototype.foo = 'Hello World'; 

// Make sure to list Bar as the actual constructor 
Bar.prototype.constructor = Bar; 

я пришел через это объяснение несколько раз «При обращении к свойству объекта, сначала он проверяет, является ли объект его само имеет то свойство и если нет, то он идет к прототипу этого объекта, чтобы искать свойство и т. д. ».

Но я изо всех сил, чтобы понять хо это на самом деле работает из-за поведения следующего кода

var test1 = new Bar(); 
var test2 = new Bar(); 

test1.value = 24; 

Теперь значение не является частью объекта test1, но это свойство его прототипа, который является Foo Object, и поскольку прототип является объектом Foo, все экземпляры Bar будут совместно использовать свойство value. Что я ожидаю, что указанный выше код должен сделать, это установить это значение в значение 24, но вместо этого он создает новое свойство с именем 'value' для test1 object и присваивает ему значение 24, оставляя свойство value в прототипе до его исходного значения 42. Это не похоже на совместное использование. test2.value по-прежнему имеет значение 42. Когда я смотрю цепочку прототипов в консоли firebug, это показывает мне, что test1 имеет свойство value с 24, а его прототип имеет свойство value с 42.

Это очень запутывает к. Имеет ли кто-нибудь, что вы выяснили, почему он ведет себя таким образом?

ответ

2

Цепь Прототип используется только при чтении свойства и только если свойство не найдено в самом объекте - он не используется при написании значений свойств.

Как только вы написать свойство в объект (test1.value = 24) любое имущество, существующего «общего» в прототипе с таким же именем скрыт, и все последующее чтение будет доступ к значению теперь хранить в самом объекте.

1

Я думаю, что вы хотите .hasOwnProperty()

Если это то, что вы ищете, кто-то красноречиво подвел итог здесь hasOwnProperty in javascript

EDIT

Начитавшись другой ответ, затем правильно прочитайте вопросы на этот раз ... Я хотел бы отменить это ;-)

...

Или, может быть, это то, что вы ищете, вы хотите проверить, было ли свойство установлено на «хэш», прежде чем делать что-то еще.

Я прочитал это слишком много раз, и спутать я думаю, я заткнуться

1

Просто добавьте следующие строки в конце, чтобы проверить, что происходит.

var test1 = new Bar(); 
test1.value = 30; 

console.log(test1.hasOwnProperty("value")); 
console.log(test1.value); 

delete test1.value; 

console.log(test1.hasOwnProperty("value")); 
console.log(test1.value); 

Выход:

true 
30 
false 
42 

Условие:

  • hasOwnProperty только возвращает истину, является ключевым фактором является локальным свойством объекта.
  • delete используется для удаления локального имущества, которое не затрагивает унаследованные свойства.

Explanantion Если присвоить значение, то он создает свою собственную локальность и отменяет прототипичный свойство. И, таким образом, поскольку локальные свойства имеют более высокое предпочтение, чем прототипные свойства, они считываются первыми.

Смежные вопросы