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() ничем не обусловлено, кроме, судя по всему, разве что незнания автора кода о существовании такого оператора.
Первая функция - объявление класса и вызов конструктора, вызов любой его реализации. Вторая функция - конкретная реализация конструктора. Можешь унаследоваться и поменять её на другую. Apply и два "смешных" this'а нужны для сохранения контекста, просто так заменить не получиться - достаточно попробовать это сделать и выполнить код.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости