#javascript #prototype
#javascript #прототип
Вопрос:
Следуйте моему коду,
Apple определяет функцию по прототипу.
Banana — это определение функции по свойству класса.
var Apple = function(){}
Apple.prototype.say = function(){
console.debug('HelloWorld');
}
var Banana = function(){
this.say = function(){
console.debug('HelloWorld');
}
}
var a = new Apple();
var b = new Banana();
a.say();
b.say();
В чем разница?
Ответ №1:
Когда вы создаете более одного экземпляра Apple, у вас все равно будет только один экземпляр say()
в памяти. Однако, когда вы создаете более одного экземпляра Banana, вы в конечном итоге создадите множество экземпляров say()
функции.
Вот почему прототипы экономят память. Вы также избегаете затрат на обработку, связанных с созданием и назначением say()
функции.
Кроме того, при изменении свойств родительского объекта, если дочерний объект не заменяет это свойство, изменения видны из дочернего объекта.
Комментарии:
1. Кроме того, изменения в прототипе «видны» всем экземплярам, что может быть полезно в некоторых случаях.
2. Да, в этом смысле это своего рода эквивалент статики.
3. Я также задавался вопросом о наследовании, поэтому я создал скрипку. Результат: это работает в обоих направлениях. jsfiddle.net/jdhenckel/tfn71a96
Ответ №2:
члены прототипа похожи на член класса, члены prototype похожи на члена класса, в то время как, когда вы определяете его другим способом, он не является членом класса. Итак, если вы создаете множество объектов Apple, все они будут использовать одну и ту же функцию, в то время как в случае banana каждый объект будет иметь свою собственную копию функции. Думайте, что прототип в javascript статичен в C #.