Исходя из моего понимания 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
}
Это имеет смысл, но есть ли какой-нибудь безопасный и эффективный способ решения этой проблемы? Поскольку использование прототипов обеспечивает преимущество в производительности за счет того, что функции-члены выделяются только один раз, я хотел бы достичь аналогичной функциональности, сохраняя при этом возможность доступа к своим частным переменным. Я не думаю, что это сработает с использованием прототипа, но есть ли другой шаблон, такой как фабричный метод или подход к закрытию? Что-то вроде
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, или есть какое-либо потенциальное преимущество в производительности. Намерение состоит в том, чтобы получить функциональность, аналогичную прототипированию (поскольку это экономит память), при этом сохраняя возможность доступа к частным переменным.
Спасибо.