一个实例化的问题

2016-10-30 00:06:15 +08:00
 rupert

假设有一个这样的构造函数,但是只能得到他的参数个数是不确定的,参数为数组形式 [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 相关解决的方法?

1806 次点击
所在节点    JavaScript
4 条回复
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
}
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}
8qwe24657913
2016-10-30 11:45:57 +08:00
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 兼容的还是要学习一个(逃
rupert
2016-10-30 16:54:48 +08:00
@8qwe24657913 赞,正是我想要的, 一楼的解法就是你说的第二种方法吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/316516

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX