Да, вы создаете новый объект Function при каждом создании объекта A. Вы можете продемонстрировать это следующим образом:
function A(){
var foo = 1;
this.method = function(){
return foo;
}
}
var a = new A();
var b = new A();
alert(a.method == b.method); // Returns false; two different Function objects
Если вы хотите повторно использовать один и тот же объект Function, сделайте метод свойством прототипа, а не экземпляров.
function B() {
this.foo = 1;
}
B.prototype.method = function() {
return this.foo;
}
var a = new B();
var b = new B();
alert(a.method == b.method); // Returns true; it's the same Function object
Редактировать: Насколько я знаю, нет причин делать что-то похожее на первую версию, кроме как для создания частных переменных в объекте JavaScript. В исходном примере foo
является приватным. Ничто не может получить к нему доступ непосредственно снаружи объекта. К сожалению, когда вы создаете большое количество объектов с помощью этой техники, это может повлиять на производительность и объем памяти.
В моем коде я использую соглашение об именах, чтобы различать «публичные» и «приватные» свойства. Я называю частные свойства подчеркиванием в качестве первого символа. Поэтому, если я вижу что-то вроде myObject._someMethod()
, я знаю, что что-то не так.
Edit2: From http://code.google.com/apis/v8/design.html, Я думаю, что V8 компилирует замыкание один раз, когда создает скрытый класс, содержащий свойство method
.