Использование apply () для цепных конструкторов в JavaScript? - PullRequest
0 голосов
/ 22 января 2019

Я учу apply() в MDN , есть пример, который я не могу понять:

// Create constructor method for array of args
Function.prototype.construct = function(aArgs) {
  var oNew = Object.create(this.prototype);
  this.apply(oNew, aArgs);
  return oNew;
};

что делает this.apply(oNew, aArgs)?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Первое: какова цель этой функции?

Цель

Эта функция-прототип 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.

0 голосов
/ 22 января 2019

Эта функция работает как оператор new в Javascript.
Вы можете выяснить, как new работает в MDN
Например, если вы определите функцию конструктора, как показано ниже

function Foo(name, age) {
  this.name = name
  this.age = age
}

Foo.prototype.hello = function() {
  console.log('hello' + this.name + this.age)
}

Если вы уже определили Function.prototype.construct, как в примере, который вы показываете.
Тогда вы можете использовать const a = new Foo('a', 1) или const a = Foo.construct('a', 1) для создания того же объекта

Иthis.apply(oNew, aArgs) используется для вызова функции конструктора для инициации только что созданного экземпляра

...