Ответы пользователя по тегу Макеты и прототипы
  • Синтаксис ООП в js и использование prototype

    runawayed
    @runawayed
    В примере E еще стоит обратить внимание на слово this, которое означает, что method будет добавлен в прототип.
    Если его не использовать, можно создавать private-свойства и методы, которые будут доступны из других методов экзмепляра, но не напрямую.

    function Obj() {
        var privateMethod = function(x) {
            return x;
        }
        this.publicMethod = function(x) {
          return privateMethod(x); 
       }
    }
    var obj = new Obj();
    obj.privateMethod(1); // -> вызовет ошибку
    obj.publicMethod(1); // -> вернет '1'
    
    
    Ответ написан
  • Синтаксис ООП в js и использование prototype

    runawayed
    @runawayed
    JS — объектно-ориентированный язык, но в нем отсутствуют классы, их заменяют конструкторы объектов, поэтому вместо обычного наследования через классы существует наследование через прототипы. Т.е. экземпляр класса наследует его свойства и методы, которые находятся в его прототипе.
    Конструктор класса (function Obj() {}) — функция, в которой описаны свойства и методы прототипа, поэтому ко всем ним будет доступ при создании экземпляра.

    В примере A конструктор пустой, а Obj.method присваивает метод объекту, а не его прототипу, поэтому он не будет наследован в obj = new Obj(). Этот пример не работает.

    Пример B — правильный, здесь метод method добавляется в прототип и будет наследоваться всеми экземплярами.

    Пример C чаще всего используется, когда нужно реализовать singleton или namespace, потому что это простой хэш без конструктора, его нельзя наследовать. Фактически это не объект в ООП понимании, а просто ассоциативный массив, в котором могут содержаться любые данные, методы и другие объекты.

    Пример D аналогичен примеру C, только его свойство method содержит ссылку на внешнюю функцию. Этот пример можно использовать, когда нужно вызвать какую-то функцию из внешней библиотеки.

    Пример E правильный и аналогичен примеру B, с разницей в том, что наследуемый метод задается сразу в конструкторе, а не через prototype.
    Ответ написан