Основываясь на моем понимании javascript, методы прототипа не могут обращаться к переменным, которые являются частными для области конструктора,
var Foo = function() {
var myprivate = 'I am private';
this.mypublic = 'I am public';
}
Foo.prototype = {
alertPublic: function() { alert(this.mypublic); } // will work
alertPrivate: function() { alert(myprivate); } // won't work
}
Это имеет смысл, но существует ли какой-либо путь вокруг этого, что является безопасным и хорошей практикой? Так как использование прототипов обеспечивает преимущество в производительности, поскольку функции-члены распределяются только один раз, я хотел бы получить аналогичную функциональность, сохраняя при этом возможность доступа к своим личным переменным. Я не думаю, что это сработает с использованием прототипа, но есть ли другой шаблон, например метод factory или подход закрытия? Что-то вроде,
var fooFactory = function() {
var _alertPrivate = function(p) { alert(p); } // bulk of the logic goes here
return function(args) {
var foo = {};
var myprivate = args.someVar;
foo.mypublic = args.someOtherVar;
foo.alertPrivate = function() { _alertPrivate(myprivate); };
return foo;
};
}
var makeFoo = new fooFactory();
var foo = makeFoo(args);
Я не уверен, создается ли новая копия _alertPrivate каждый раз, когда я создаю новый Foo или если есть потенциальная полезность. Цель состоит в том, чтобы получить функциональность, похожую на прототипирование (поскольку она сохраняет память), хотя она все еще может обращаться к закрытым переменным.
Спасибо.