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

334
08 сентября 2017, 23:31
function A() {
    this._init.apply(this, arguments);
}
A.prototype._init = function() {
    // ...
}
let a = new A();

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

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

Answer 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() ничем не обусловлено, кроме, судя по всему, разве что незнания автора кода о существовании такого оператора.

Answer 2

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

READ ALSO
Помогите разобраться с методом array.indexOf()

Помогите разобраться с методом array.indexOf()

Добрый деньНе могу понять, как правильно сделать, чтобы метод indexOf() работал и выводил в консоль найденный элемент

318
JS JSON - почему работает именно так? [дубликат]

JS JSON - почему работает именно так? [дубликат]

На данный вопрос уже ответили:

295
Когда делаю свайп слайда ==> выезжает меню меню находиться слева(slideout.js) как это решить можно?

Когда делаю свайп слайда ==> выезжает меню меню находиться слева(slideout.js) как это решить можно?

Здравствуйте есть сверстанный сайт и к нему подключен script slideoutjs и есть на сайте слайдер вот такая проблема когда я хочу сдвинуть свайпом...

323
Pug (Jade) динамическое добавление атрибута

Pug (Jade) динамическое добавление атрибута

Нужно в зависимости от переменной установить атрибут тега

349