Страницы

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

понедельник, 3 декабря 2018 г.

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

function A() { this._init.apply(this, arguments); }
A.prototype._init = function() { // ... }
let a = new A();
Не могу понять, зачем необходимо такое разделение? Зачем в теле конструктора вызывать другой метод в контексте того же объекта, если весь код, находящийся в теле конструктора можно поместить в сам конструктор? Какие преимущества дает такое разделение?
И еще. Зачем здесь вообще #apply()? Разве простой вызов this._init(arguments) не выполнит то же самое?


Ответ

Как оказалось, всё дело тут в хорошо запрятанной документации. В 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() ничем не обусловлено, кроме, судя по всему, разве что незнания автора кода о существовании такого оператора.

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

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