Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Зачем в чужом коде тело конструктора вынесено в отдельный метод?

#javascript


function A() {
    this._init.apply(this, arguments);
}

A.prototype._init = function() {
    // ...
}

let a = new A();


Не могу понять, зачем необходимо такое разделение? Зачем в теле конструктора вызывать
другой метод в контексте того же объекта, если весь код, находящийся в теле конструктора
можно поместить в сам конструктор? Какие преимущества дает такое разделение?

И еще. Зачем здесь вообще #apply()? Разве простой вызов this._init(arguments) не
выполнит то же самое?
    


Ответы

Ответ 1



Как оказалось, всё дело тут в хорошо запрятанной документации. В StyleGuide'ах обнаружилась инфа следующего вида: Our pattern for writing classes is: function Foo(arg1, arg2) { this._init(arg1, arg2); } Foo.prototype = { _init: function(arg1, arg2) { this._myPrivateInstanceVariable = arg1; }, myMethod: function() { }, myClassVariable: 42, myOtherClassVariable: 'Hello' } Чем такое решение обусловлено, ответить не могу. А решение впихнуть сюда .apply(), как подсказал в комментариях к вопросу @Grundy обусловлено попыткой воссоздать функционал spread оператора. К слову, движок (GJS), интерпретирующий код, позволяет использовать spread. Поэтому конкретно в этом случае использование .apply() ничем не обусловлено, кроме, судя по всему, разве что незнания автора кода о существовании такого оператора.

Ответ 2



Первая функция - объявление класса и вызов конструктора, вызов любой его реализации. Вторая функция - конкретная реализация конструктора. Можешь унаследоваться и поменять её на другую. Apply и два "смешных" this'а нужны для сохранения контекста, просто так заменить не получиться - достаточно попробовать это сделать и выполнить код.

Комментариев нет:

Отправить комментарий