V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
rupert
V2EX  ›  JavaScript

一个实例化的问题

  •  
  •   rupert · 2016-10-30 00:06:15 +08:00 · 1839 次点击
    这是一个创建于 2982 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    4 条回复    2016-10-30 16:54:48 +08:00
    SoloCompany
        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
    }
    Mutoo
        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}
    8qwe24657913
        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 兼容的还是要学习一个(逃
    rupert
        4
    rupert  
    OP
       2016-10-30 16:54:48 +08:00
    @8qwe24657913 赞,正是我想要的, 一楼的解法就是你说的第二种方法吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2781 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:55 · PVG 19:55 · LAX 03:55 · JFK 06:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.