Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.08.2012, 16:07
Аспирант
Отправить личное сообщение для burashka Посмотреть профиль Найти все сообщения от burashka
 
Регистрация: 15.07.2010
Сообщений: 49

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

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

return Constr;
}());


но разве при таком объявлении мы не получим одно частное свойство на все созданные с помощью возвращенного конструктора объекты? т.е. все объекты в качестве частного свойства будут иметь ссылку на один и тот же объект
Ответить с цитированием
  #2 (permalink)  
Старый 13.08.2012, 18:54
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от burashka
но разве при таком объявлении мы не получим одно частное свойство на все созданные с помощью возвращенного конструктора объекты? т.е. все объекты в качестве частного свойства будут иметь ссылку на один и тот же объект
смотря что вернёт этот метод
this.toArray(o);
Ответить с цитированием
  #3 (permalink)  
Старый 14.08.2012, 09:44
Аспирант
Отправить личное сообщение для burashka Посмотреть профиль Найти все сообщения от burashka
 
Регистрация: 15.07.2010
Сообщений: 49

т.е. с частными свойствами могут работать только методы объявленные прямо в конструкторе? методы созданные через дополнение прототипа либо не будут иметь доступа к переменной(если это делается вне конструктора), либо во всех объектах будут ссылаться на одно и тоже частное свойство(если это делается внутри конструктора)
например,
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
Ответить с цитированием
  #4 (permalink)  
Старый 14.08.2012, 15:04
Аспирант
Отправить личное сообщение для burashka Посмотреть профиль Найти все сообщения от burashka
 
Регистрация: 15.07.2010
Сообщений: 49

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 от нового объекта. Почему же в них всегда лежит одна и та же переменная а?
Ответить с цитированием
  #5 (permalink)  
Старый 14.08.2012, 17:06
Аспирант
Отправить личное сообщение для burashka Посмотреть профиль Найти все сообщения от burashka
 
Регистрация: 15.07.2010
Сообщений: 49

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Три книги по JavaScript... Почемучкин Учебные материалы 12 30.11.2011 22:52
Книги по JavaScript (Sandr) Сайт Javascript.ru 6 23.06.2011 12:27