2015-08-23 2 views
2

у нас есть пример кода, как это:Путаница в отношении заходящего собственности родительского объекта от дочернего объекта в JavaScript

var obj1={ prop:1 }; 
var obj2=Object.create(obj1); 
obj2.prop=2; 
console.log(obj1.prop); 

Здесь мы будем иметь выход как 1, потому что в дочернем объекте obj2 свойство prop будут затенены. Однако, когда я делаю это:

var obj1={ prop:{subProp:1} }; 
var obj2=Object.create(obj1); 
obj2.prop.subProp=2; 
console.log(obj1.prop.subProp); 

Вот удивительно, я считаю, что выход 2 несмотря на то, что значение, изменяющихся на дочернем объекте. Почему здесь нет переменной тени. Другими словами, почему не создано новое свойство, называемое prop, на obj2 и почему здесь обрабатывается prop родительского объекта (obj1)?

EDIT: Если я сделать следующее

var obj1={ prop:1 }; 
var obj2=Object.create(obj1); 
var isPresent=obj2.hasOwnProperty('prop'); 
console.log(isPresent); 

здесь выход будет ложным. Однако:

var obj1={ prop:1 }; 
var obj2=Object.create(obj1); 
var isPresent=obj2.hasOwnProperty('prop'); 
console.log(isPresent); 
obj2.prop=2; 
isPresent=obj2.hasOwnProperty('prop'); 
console.log(isPresent); 

Здесь вы можете увидеть после строки obj2.prop=2 выход верно. Это меня тоже смущает.

+1

Вы можете найти [* The Resolution имен объектов на объектах *] (http://www.jibbering.com/faq/notes/closures/#clResO). – RobG

ответ

2

Это связано с тем, что при создании obj2 ни одно из свойств не копируется, но прототип obj2 становится obj1. Это означает, что при чтении движок ищет свойства во всей цепочке прототипов и при записи, вы просто пишете объект.

Что происходит, когда вы делаете obj2.prop = 2 является то, что вы пишете obj2 непосредственно, но когда вы делаете obj2.prop.subProp = 2 вы первый попросив двигатель читать obj2.prop, а затем записать на этот объект какое-то значение.

Во втором примере, вы никогда не писать непосредственно obj2 так obj2 все еще «пустой» (вы можете проверить, что с помощью obj2.hasOwnProperty('prop') после каждого примера, как Вы предложили в комментарии)

+0

Однако при добавлении этой строки obj2.hasOwnProperty ('prop') перед установкой obj2.prop = 2; в первом случае я получаю ложный ответ. Но woudnt, что подразумевается, что prop не существует в obj2 в этот момент? –

+0

Oups, я неправильно понял проблему. Вы совершенно правы, я полностью отредактировал ответ, чтобы исправить эту ошибку. –

+1

@KiranYallabandi Вы можете найти [это] (https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance) быстрое введение в JavaScript Prototypal Inheritance. – Vidul

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