#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'а нужны для сохранения контекста, просто так заменить не получиться - достаточно попробовать это сделать и выполнить код.
Комментариев нет:
Отправить комментарий