2013-03-29 3 views
4

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

function Gadget(name, color) { 
    this.name = name; 
    this.color = color; 
    this.whatAreYou = function(){ 
     return 'I am a ' + this.color + ' ' + this.name; 
    } 
} 

Gadget.prototype.price = 100; 
Gadget.prototype.rating = 3; 
Gadget.prototype.getInfo = function() { 
    return 'Rating: ' + this.rating + ', price: ' + this.price; 
}; 

var newtoy = new Gadget('webcam', 'black'); 

newtoy.constructor.prototype 

Gadget {price: 100, rating: 3, getInfo: function} //Expected 

Теперь, если я пытаюсь следующий, прототип не имеет ожидаемых результатов.

function Gadget(name, color) { 
    this.name = name; 
    this.color = color; 
    this.whatAreYou = function(){ 
     return 'I am a ' + this.color + ' ' + this.name; 
    } 
} 

Gadget.prototype = { 
    price: 100, 
    rating: 3, 
    getInfo: function() { 
     return 'Rating: ' + this.rating + ', price: ' + this.price; 
    } 
}; 

var newtoy = new Gadget('webcam', 'black'); 

newtoy.constructor.prototype 

Object {} //Empty Object!!!!!??? 
+0

Вы ищете 'newtoy .__ proto__'? т.е. что вы ищете, проходя через 'newtoy.constructor'? –

+0

http://stackoverflow.com/a/8096017/783743 –

ответ

4

jsFiddle Demo

Это потому, что вы перезаписали прототип вместо расширения, когда вы сделали это:

Gadget.prototype = 

Обычно при перезаписи его, чтобы сделать фасад конструктор выглядит следующим образом:

Gadget.prototype = { 
constructor : Gadget 
} 

Так что для вашей конкретной ситуации:

Gadget.prototype = { 
constructor : Gadget, 
price: 100, 
rating: 3, 
getInfo: function() { 
    return 'Rating: ' + this.rating + ', price: ' + this.price; 
} 
}; 
+0

В этом проблема, но было бы более полезно, если бы вы объяснили, как это сделать должным образом. Я верну его, если вы сделаете – Markasoftware

+0

@Markasoftware - См. Edit –

+1

А ... это действительно имеет смысл. Я читаю книгу «Объектно-ориентированный Javascript» Стояна Стефанова, и он это делает, но не смог четко сказать о последствиях, или я не смог понять. – KingKongFrog

1

Прототип изначально специальный объект типизированных. Когда вы назначаете прототип новому объекту (фигурные скобки - короткие руки для нового объекта), вы теряете специальный объект-прототип.

См. How does JavaScript .prototype work? для более глубокого объяснения.

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