Можно ли получить доступ к закрытым переменным в области конструктора из прототипа функций?

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

Спасибо.

8
задан Rob W 27 December 2011 в 15:41
поделиться