假设有一个这样的构造函数,但是只能得到他的参数个数是不确定的,参数为数组形式 [3,4,5,..], 然后希望实例化出一个对象
var arr = [3,4,5..]
function f(a,b..) {
this.a = a
this.b = b
...
}
我所知道的方法有两种 new f(...arr)
和 Reflect.construct(f, arr)
,
但是我还想知道有没有用 apply 相关解决的方法?
1
SoloCompany 2016-10-30 02:26:28 +08:00
或许是 ECMA1 兼容的 Reflect.construct 版本
function contract(f, arr) var x = {} x.__proto__ = f.prototype f.apply(x, arr) return x } |
2
Mutoo 2016-10-30 06:36:33 +08:00
var f = function(){
for(var i=0;i<arguments.length;i++){ this[String.fromCharCode(97+i)]=arguments[i] }; }; new f(1,3,4); // Object {a: 1, b: 3, c: 4} |
3
8qwe24657913 2016-10-30 11:45:57 +08:00 via Android
new (f.bind.apply(f, [1].concat(arr)))();
大概这样 PS ,在没有 bind 的时代人们是这样用的: function g(){}; g.prototype=f.prototype; f.apply(new g(),arr); 但是后来有了 new.target 和 class ,第二种方法不好用了 如果你用 babel 把 new f(...arr);转成 ES5 的话你会发现用的是第一种方法,只是多个 helper 函数来确保 arr 是个数组而不是什么奇怪的东西 PPS ,__proto__是浏览器厂商自己搞出来的,说它 ECMA1 兼容的还是要学习一个(逃 |
4
rupert OP @8qwe24657913 赞,正是我想要的, 一楼的解法就是你说的第二种方法吧
|