Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

如何在 new 的时候 apply?

  对于一般的函数调用,要想传入一个数组作为每一个参数可以用 apply。可是 apply 只是调用,并不是 new。那么在 new 的时候想传入一个数组作为每一个参数要怎么办?如果真遇到这种需求,熟悉规范的同学肯定有办法强行模拟出一个来。而如果是 ES6 的话本来就可以支持。
  在 ES5 中,我们可以先用 Object.create 创建一个未初始化的实例,然后再调用构造器来初始化这个。
var A = function() {}; var args = [ 1, 2, 3 ]; var a = Object.create(A); var r = A.apply(a, args); if (r instanceof Object) a = r;   如果是 ES3,只要模拟实现一个 Object.create 即可实现。
  可是到了 ES6,上面的方案就不行了,因为 ES6 区分调用和构造,所以 apply 是不行的。但 ES6 支持参数展开的语法,所以可以直接这么玩:
class A { constructor() { console.log(new.target === A); // true } } let args = [ 1, 2, 3 ]; let a = new A(...args);   另外 ES6 为了这件事专门在 Reflect 对象中提供了 construct 方法。
class A { constructor() { console.log(new.target === A); // true } } let args = [ 1, 2, 3 ]; let a = Reflect.construct(A, args);   而且比起直接使用参数展开,Reflect.construct 的第三个参数还可以传入 newTarget。
网名:
52.91.185.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^