В чем разница между определением функции по прототипу и свойством класса? - PullRequest
44 голосов
/ 06 мая 2011

Следуйте моему коду,
Apple - это определение функции по прототипу.
Банан - определение функции по свойству класса.

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();

Это разница?

Ответы [ 2 ]

66 голосов
/ 06 мая 2011

Когда вы создаете более одного экземпляра Apple, у вас все равно будет только один экземпляр say() в памяти.Однако, когда вы создаете более одного экземпляра Banana, вы в конечном итоге создаете множество экземпляров функции say().

Именно поэтому прототипы экономят память.Вы также избегаете затрат на обработку создания и назначения функции say().

Кроме того, если вы измените свойства родительского объекта, если дочерний объект не заменит это свойство, изменения будут видны из дочернего элемента.

2 голосов
/ 06 мая 2011

члены-прототипы похожи на члены класса membeprototype, как члены класса, тогда как когда вы определяете его иначе, он не является членом класса.Таким образом, если вы создаете много объектов Apple, все будут использовать одну и ту же функцию, в то время как в случае с бананом у каждого объекта будет своя копия функции.Думайте прототип в JavaScript как статический в C #.

...