本文没什么养分,只是暂时用到纪录一下,进修的请绕道。
题目
简而言之,我有一个类函数:
function F(m, n){
this.v = m * n;
}
var f = new F(1, 2);
然则我想运用数组作为参数表建立实例,比方:
var f = applyNew(F, [1, 2]);
叨教,applyNew
应怎样完成?
解答1
最直接的要领是运用 Function.prototype.bind
。完成代码以下:
function applyNew(ctor, args) {
var applyArgs = ([{}]).concat(args || []);
var f = Function.prototype.bind.apply(ctor, applyArgs);
return new f();
}
注重,([{}]).concat(args || [])
这行代码是由于 bind
不仅要绑定参数,还要绑定 this
,由于 new 操纵会把心建立的对象作为 this
,所以这里绑定谁都无所谓,随意分派一个即可。
解答2
假如不想运用 bind,还能够本身完成:
function applyNew(ctor, args) {
function F() {
return ctor.apply(this, args);
}
F.prototype = ctor.prototype;
return new F();
}
实际上这即是本身用闭包完成了 bind。然则这里有一个题目:假如 ctor
是 String、Array、Date 如许的 native 类函数,这类要领就不适用了。
运用场景
有兴致能够思索一下,什么场景会用到如许的代码?我是在完成恣意类函数 mixin 的时刻用到的。