2016-09-12 5 views
1

Пытается прояснить некоторые основы прототипа наследования.Свойство, установленное в конструкторе, переопределяет свойство на прототипе

function thirdSampleObject(){ 
    this.first_var = 3; 
    this.update = function(){"Hi I am a function"}; 
} 

var thirdClass = new thirdSampleObject(); 
var fourthClass = new thirdSampleObject(); 

thirdClass.first_var = 5; 
fourthClass.first_var = 7; 


console.log(thirdClass.first_var); //returns 5 
console.log(fourthClass.first_var); //returns 7 

thirdSampleObject.prototype.first_var = 10; 

console.log(thirdClass.first_var); //returns 5 "protectected" within it's own instance of the object 
console.log(fourthClass.first_var); //returns 7 "protectected" within it's own instance of the object 

var fithClass = new thirdSampleObject(); 
console.log(fithClass.first_var); //returns 3 ? Wouldn't this return 10 at this point?` 

Я ожидал бы console.log(fithClass.first_var) вернуться 10, так как я переписал значение в прототипе. Однако возвращает число, установленное в «оригинальном» определении прототипа. Почему мы пытаемся обернуть голову.

+0

В конструкторе вы устанавливаете свойство экземпляра. Это свойство всегда будет заслонять свойство, установленное в прототипе. – Sirko

+2

Вы должны задать свой вопрос для значимого названия, например, «свойство, установленное в конструкторе, переопределяет свойство на прототипе». –

+0

Назначение в конструкторе не имеет ничего общего с прототипом; значение 'this' в конструкторе - это новый объект, а не прототип. – Pointy

ответ

4

Независимо от значения first_var на прототипе, ваш конструктор явно устанавливает значение для вновь созданного объекта.

Код в конструкторе выполняет то же самое, что и назначения в коде вне конструктора, другими словами. Код в функции конструктора - это просто код, а в конструкторе this ссылается на новый объект, а не на прототип.

+1

Получил. Схватил вместе быструю демоверсию, чтобы настроить все в правильном движении в моей голове. Очень благодарен! – dima

+0

@dima рад это слышать! – Pointy

1

Наследование прототипа произойдет, если объект не обладает свойством, а прототип этого объекта обладает свойством.

function thirdSampleObject(){ 
    this.first_var = 3; 
    this.update = function(){"Hi I am a function"}; 
} 
thirdSampleObject.prototype.first_var = 10; 

var fifthClass = new thirdSampleObject(); 

fifthClass.hasOwnProperty('first_var'); // returns true. i,e fifthClass object have its own property 'first_var'. 

console.log(fifthClass.first_var); 

delete fifthClass.first_var //here we are deleting the property from object. 

fifthClass.hasOwnProperty('first_var'); // returns false 

console.log(fifthClass.first_var); // returns 10 
Смежные вопросы