Когда функция определена в конструкторе, каждый раз, когда вызывается конструктор, создается новый экземпляр этой функции. Он также имеет доступ к частным переменным.
var myClass = function() {
// private variable
var mySecret = Math.random();
// public member
this.name = "Fred";
// privileged function (created each time)
this.sayHello = function() {
return 'Hello my name is ' + this.name;
// function also has access to mySecret variable
};
}
Когда функция определена на прототипе, то функция создается только один раз и один экземпляр этой функции является общим.
var myClass = function() {
// private variable
var mySecret = Math.random();
// public member
this.name = "Fred";
}
// public function (created once)
myClass.prototype.sayHello = function() {
return 'Hello my name is ' + this.name;
// function has NO access to mySecret variable
};
Таким образом, определение функции на прототипе создает меньше объектов, которые могут дать лучшую производительность. С другой стороны, общедоступные методы не имеют доступа к частным переменным. Дальнейшие примеры и аргументы можно найти здесь: http://www.crockford.com/javascript/private.html
@aharon: На всякий случай: будьте осторожны при использовании ['this'] (http://blog.niftysnippets.org/2008/04/you-must-remember -this.html). –
Я обновил свой ответ, чтобы сделать более понятным разницу между публичной, частной и привилегированной. – Greg