2016-12-14 5 views
2

Ну, я любопытный, чтобы узнать о прототипах в javascript и нашел много статей, однако я не могу понять, почему я не могу использовать прототипы в Object литералах в javascript. Как мы все знаем, все наследуется от Object так что в этом случаеПочему я не могу использовать прототип в Object Literals в javascript?

function Dog() { 
} 

Dog.prototype = new Animal; 
Dog.prototype.bark = function() { 
    console.log("Woof! My name is " + this.name); 
}; 

Если я могу использовать прототип функции почему я не в состоянии использовать прототип в литералов объектов, например, в приведенном ниже примере

var obj = { 
      firstname: 'foo', 
      lastname:'bar' 
     } 
     // this throws an error 
     obj.prototype.getMethod = function() { 
      console.log('this is a function'); 
     } 

Я прошел весь этот вопрос, но он действительно не отвечает причине, почему использование прототипа can not в объектных литералах в javascript. Ниже приведены некоторые из ссылок

refrence 1

refrence 2

refrence 3

+1

Вы проверили http://stackoverflow.com/questions/3452414/adding-a-prototype-to-an-object-literal ...? –

ответ

1

Прежде всего, .prototype свойства принадлежит объекту функции. Вы не можете получить к нему доступ из экземпляра простого объекта. В основном свойство-конструктор .prototype будет использоваться при построении внутреннего [[prototype]] экземпляра экземпляра. Здесь у Вас есть экземпляр, если вы хотите, чтобы добавить функцию в цепи прототипов этого, то вы должны изменить его

var obj = { firstname: 'foo', lastname:'bar' }; 
var pro = Object.getPrototypeOf(obj); 
pro.getMethod = function() { 
    console.log('this is a function'); 
}; 

Как @bergi указывалось, существует риск добавления getMethod в все случаи, если мы будем следовать вышеуказанному подходу. Но для того, чтобы избежать этого, вы могли бы в качестве альтернативы сделать,

var obj = { firstname: 'foo', lastname:'bar' }; 
Object.setPrototypeOf(obj, Object.create({getMethod : function(){ 
    console.log("Hello"); 
}})); 

console.log(obj.getMethod()); //"Hello" 
+2

@ LijinJohn Конечно, да. ;) –

+0

каждый объект унаследован, не так ли? то почему мы не можем получить свойство прототипа в объектных литералах, как объектный литерал настолько отличается от функции в javascript? –

+0

Обратите внимание, что 'pro === Object.prototype', поэтому вы, вероятно, сделаете * not * хотите его изменить – Bergi

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