В чем разница между определением функции по прототипу и свойством класса?

#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 #.