使用apply()链接JavaScript中的构造函数?

时间:2019-01-22 09:24:32

标签: javascript apply

我正在MDN中学习apply(),有一个我不知道的例子:

// 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 :(得分:2)

首先:此功能的目的是什么?

目标

此原型函数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);

回想一下thisPerson,所以我们在这里通过Person调用applyapply使得可以使用特定的this对象值(我们新创建的Person实例)和参数作为数组来调用函数-正是我们所需要的。

因此,以上内容将使用namegender参数初始化我们的空对象,完成通常用new进行的完整创建和初始化。

答案 1 :(得分:1)

此功能的工作方式类似于Java中的运算符!
您可以在MDN中找出new的工作方式
例如,如果您定义如下的构造函数

new

如果您已经按照显示的示例定义了function Foo(name, age) { this.name = name this.age = age } Foo.prototype.hello = function() { console.log('hello' + this.name + this.age) }
然后,您可以使用Function.prototype.constructconst a = new Foo('a', 1)创建相同的对象

const a = Foo.construct('a', 1)用于调用构造函数以初始化刚刚创建的实例