Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   шаблон "Модуль" из книги Стефанова (https://javascript.ru/forum/misc/30720-shablon-modul-iz-knigi-stefanova.html)

burashka 13.08.2012 16:07

шаблон "Модуль" из книги Стефанова
 
В замечательной книге С.Стефанова по шаблонам JS в главе 5 есть описание использования шаблона "модуль" с помощью немедленно вызываемой функции возвращающей функцию-конструктор(стр 132).
MYAPP.utilities.Array = (function() {
var Constr,
//зависимости
//частные свойства и методы...
...;

Constr = function(o){
this.elements = this.toArray(o);
};
Constr.prototype = {
...
};

return Constr;
}());


но разве при таком объявлении мы не получим одно частное свойство на все созданные с помощью возвращенного конструктора объекты? т.е. все объекты в качестве частного свойства будут иметь ссылку на один и тот же объект

melky 13.08.2012 18:54

Цитата:

Сообщение от burashka
но разве при таком объявлении мы не получим одно частное свойство на все созданные с помощью возвращенного конструктора объекты? т.е. все объекты в качестве частного свойства будут иметь ссылку на один и тот же объект

смотря что вернёт этот метод
this.toArray(o);

burashka 14.08.2012 09:44

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

burashka 14.08.2012 15:04

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 от нового объекта. Почему же в них всегда лежит одна и та же переменная а?

burashka 14.08.2012 17:06

Maxmaxmахimus,
спасибо. Может я туплю, но так и не понял из описания прототипа почему если создать методы объекта, то они ссылаются на частное свойство своего объекта, а если создать методы прототипа объекта, то они ссылается на одно и тоже частное свойство для любого объекта


Часовой пояс GMT +3, время: 12:23.