2017-02-03 6 views
1

Я пытался объяснить редкие случаи использования прототипного наследования со стороны коллеги, когда я был в тупике от того, что это не работает, как я ожидаю.Не следует ли присвоить свойство прототипа переопределить его на прототипе?

const baseobj = { baseproperty: 'original'}; 
 

 
const x = Object.create(baseobj); 
 

 
//should add properties to x, not the base 
 
x.newproperty = 'bar'; 
 
console.assert(x.newproperty != baseobj.newproperty); 
 
//so far so good 
 

 
//should modify the base, not x 
 
x.baseproperty = 'foo'; 
 
console.assert(x.baseproperty == baseobj.baseproperty); 
 
//this assert failed, property is on x!?

Я запутался. Насколько я понимаю, назначение - это двухэтапный процесс, один - поиск свойства, а другой - назначение ему. Итак, почему на земле поиск baseproperty не возвращается (и, следовательно, изменяется) baseobj.baseproperty?

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

+1

Было бы плохо, если бы это сработало. Это означало бы, что присвоение собственности может неявно изменять другие объекты, которые имеют один и тот же прототип. Простейший пример: '({}). ToString = 42;'. Должно ли свойство 'toString' каждого * объекта теперь быть' 42'? –

+0

Я не уверен, что знаю, о чем вы думаете в Angular, но если бы вы опубликовали какой-то пример, это было бы интересно. – Pointy

ответ

2

Присвоение собственности объекту объекта всегда создает собственное свойство на целевом объекте (если оно не существует, конечно). Такие свойства не влияют на свойства прототипа, даже если существует свойство прототипа-цепочки, совпадающее с именем.

После назначения, конечно, «собственное» свойство объекта скрывает свойство цепи прототипа.

+0

Даже те, что существуют на прототипах? –

+0

@GeorgeMauer да, даже те, что существуют на прототипах. Другими словами, единственный способ изменить свойство prototype chain - найти его непосредственно на соответствующем объекте прототипа и изменить его там. – Pointy

+0

Не против предоставления ссылки? Я уверен, что я читал, что двухэтапный процесс - это ядро ​​до (хотя очевидно, что у меня есть доказательства обратного) –

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