小技能:如安在 js 中运用 apply 语法实行 new?

本文没什么养分,只是暂时用到纪录一下,进修的请绕道。

题目

简而言之,我有一个类函数:

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 的时刻用到的。

    原文作者:Y3G
    原文地址: https://segmentfault.com/a/1190000006793264
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞