我正在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)
会做什么?
答案 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);
回想一下this
是Person
,所以我们在这里通过Person
调用apply
。 apply
使得可以使用特定的this
对象值(我们新创建的Person
实例)和参数作为数组来调用函数-正是我们所需要的。
因此,以上内容将使用name
和gender
参数初始化我们的空对象,完成通常用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.construct
或const a = new Foo('a', 1)
创建相同的对象
const a = Foo.construct('a', 1)
用于调用构造函数以初始化刚刚创建的实例