Я все еще борюсь с этой концепцией. У меня есть два разных объекта Person, очень просто:
;Person1 = (function() {
function P (fname, lname) {
P.FirstName = fname;
P.LastName = lname;
return P;
}
P.FirstName = '';
P.LastName = '';
var prName = 'private';
P.showPrivate = function() { alert(prName); };
return P;
})();
;Person2 = (function() {
var prName = 'private';
this.FirstName = '';
this.LastName = '';
this.showPrivate = function() { alert(prName); };
return function(fname, lname) {
this.FirstName = fname;
this.LastName = lname;
}
})();
И скажем, я вызываю их так:
var s = new Array();
//Person1
s.push(new Person1("sal", "smith"));
s.push(new Person1("bill", "wonk"));
alert(s[0].FirstName);
alert(s[1].FirstName);
s[1].showPrivate();
//Person2
s.push(new Person2("sal", "smith"));
s.push(new Person2("bill", "wonk"));
alert(s[2].FirstName);
alert(s[3].FirstName);
s[3].showPrivate();
Person1
устанавливает оповещения «счет» дважды, затем оповещает «частный» один раз - поэтому он распознает функцию showPrivate
, но локальная переменная FirstName
перезаписывается.
Второй Person2
устанавливает оповещения "sal", затем "bill", но происходит сбой при вызове функции showPrivate
. Ключевое слово new
здесь работает так, как я и ожидал, но showPrivate
(который я считал публичной функцией внутри замыкания), по-видимому, не публично.
Как я могу убедиться, что мое закрытие является объектом многократного использования с открытыми методами? Я использую (function () {// объектный код}) (); синтаксис, гарантирующий, что мои переменные будут видны только для создаваемого объекта. Спасибо!