шаблон "Модуль" из книги Стефанова
В замечательной книге С.Стефанова по шаблонам JS в главе 5 есть описание использования шаблона "модуль" с помощью немедленно вызываемой функции возвращающей функцию-конструктор(стр 132).
MYAPP.utilities.Array = (function() {
var Constr,
//зависимости
//частные свойства и методы...
...;
Constr = function(o){
this.elements = this.toArray(o);
};
Constr.prototype = {
...
};
return Constr;
}());
но разве при таком объявлении мы не получим одно частное свойство на все созданные с помощью возвращенного конструктора объекты? т.е. все объекты в качестве частного свойства будут иметь ссылку на один и тот же объект |
Цитата:
this.toArray(o); |
т.е. с частными свойствами могут работать только методы объявленные прямо в конструкторе? методы созданные через дополнение прототипа либо не будут иметь доступа к переменной(если это делается вне конструктора), либо во всех объектах будут ссылаться на одно и тоже частное свойство(если это делается внутри конструктора)
например,
function Obj()
{
var a = 1;
arguments.callee.prototype.add = function()
{
a++;
}
arguments.callee.prototype.get = function()
{
return a;
}
}
var o1 = new Obj(),
o2 = new Obj();
o1.add();
o2.get();
вернет 2 |
Maxmaxmахimus,
охнифигасе там по ссылке обсуждения... попытаюсь переформулировать свою фразу: привилигированными методами могут быть только методы объявленные прямо в конструкторе и принадлежащие ему. Т.е. вот такое нормально сработает и вернет 1:
function Obj()
{
var a = 1;
this.add = function()
{
a++;
}
this.get = function()
{
return a;
}
}
var o1 = new Obj(),
o2 = new Obj();
o1.add();
o2.get();
если же пытаться сделать привилегированные методы в прототипе, как в моем предыдущем примере, то получается хрень. Как работают замыкания я понимаю. Видимо я не понимаю как работает прототип. В прошлом примере мы же при каждом вызове конструктора заново создаем функции прототипа? Тогда они должны по замыканию подхватить новую переменную a от нового объекта. Почему же в них всегда лежит одна и та же переменная а? |
Maxmaxmахimus,
спасибо. Может я туплю, но так и не понял из описания прототипа почему если создать методы объекта, то они ссылаются на частное свойство своего объекта, а если создать методы прототипа объекта, то они ссылается на одно и тоже частное свойство для любого объекта |
| Часовой пояс GMT +3, время: 22:55. |