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