Первое: какова цель этой функции?
Цель
Эта функция-прототип constructor
определена как альтернатива new
.Если new Person(a,b)
потребуются аргументы как таковые, эта функция предоставляет способ передать эти аргументы в виде массива.
В качестве примечания: следует сказать, что синтаксис расширения делает такую функцию ненужной, поскольку мы можем передать такой массив, например, так: new Person(...[a,b])
.Но хорошо ...
Пример использования
Допустим, у нас есть конструктор:
function Person(name, gender) {
this.name = name;
this.gender = gender;
}
И у меня есть массив с аргументами:
var args = ["Helen", "F"];
Тогда мы могли бы сделать:
var person = new Person(args[0], args[1]);
Но мы хотим передать args
в качестве одного аргумента.Теперь эта функция-прототип поможет нам в этом.Теперь мы можем сделать:
var person = Person.construct(args);
// Create constructor method for array of args
Function.prototype.construct = function(aArgs) {
var oNew = Object.create(this.prototype);
this.apply(oNew, aArgs);
return oNew;
};
function Person(name, gender) {
this.name = name;
this.gender = gender;
}
var args = ["Helen", "F"];
var person = Person.construct(args);
console.log(person);
Как это работает
При вызове Person.construct(args)
объект this
будет Person
, т.е. наша функция конструктора.
Затем делается следующее:
var oNew = Object.create(this.prototype);
Это создаст Person
объект, но без фактического вызова функции конструктора Person
, поэтому объект не инициализируется.Это просто пустой объект, который является экземпляром Person
.
Так что нам нужно как-то вызвать Person
с аргументами, которые у нас есть.Мы можем использовать apply
для этого:
this.apply(oNew, aArgs);
Напомним, что this
это Person
, поэтому мы вызываем Person
здесь через apply
.apply
позволяет вызывать функцию с определенным значением this
объекта (наш недавно созданный экземпляр Person
) и аргументами в виде массива - именно то, что нам нужно.
Так что вышеИнициализируем наш пустой объект с аргументами name
и gender
, завершив полное создание и инициализацию, которые вы обычно выполняете с new
.