2014-11-29 2 views
-4

Я пытаюсь переопределить .name свойство конструктора b. Но это не работает. Что не так с кодом.Переопределить свойство объекта с использованием прототипа

function b(){ 
    this.name="johnson" 
} 

b.prototype.name="david" 
var a= new b() 

alert(a.name) 
+0

Почему голосования вниз , Я опубликовал что-то неправильно – Carlos

+2

Хорошо, говоря, что «это не работает», не говоря ни о том, что вы ожидаете, так и о том, что вы получаете, является проблемой. –

ответ

2

Если вы видите "johnson" в вашем alert, то он работает точно правильно.

Когда вы добавляете свойство непосредственно к объекту, оно имеет приоритет над любым свойством с тем же именем на его прототипе. Таким образом, в

var a = new b(); 

... хотя прототип a «ы имеет name="david", aсам имеет name="johnson" (назначен в вызове b), и так, что выигрывает.

Чтение значения свойства объекта в основном работает следующим образом (предположим, что __proto__ магическое свойство объекта, которое ссылается на свой прототип [который будет, в ES6]):

function getPropertyValue(obj, propertyName) { 

    // Start with the object itself 
    var o = obj; 

    // Loop until we find an object in the prototype chain that has a property called "name" 
    while (!o.hasOwnProperty(propertyName)) { 
     // This one doesn't, look to its prototype 
     o = o.__proto__; 

     // Did it have one? 
     if (!o) { 
      // No, property not found 
      return undefined; 
     } 
    } 
    return o[propertyName]; 
} 
Смежные вопросы