资讯专栏INFORMATION COLUMN

小技巧:如何在 js 中使用 apply 语法执行 new?

GeekQiaQia / 880人阅读

摘要:问题简而言之,我有一个类函数但是我想使用数组作为参数表创建实例,比如请问,应如何实现解答最直接的方法是使用。应用场景有兴趣可以思考一下,什么场景会用到这样的代码我是在实现任意类函数的时候用到的。

本文没什么营养,只是临时用到记录一下,学习的请绕道。

问题

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80277.html

相关文章

  • 从Ecma规范深入理解this

    摘要:本文总结了的各种情况,并从规范的角度探讨了的具体实现,希望对大家理解有所帮助。规范规范里面详细介绍了的实现细节,通过阅读规范,我们可以更准确的理解上述四种情况到底是怎么回事。由于本人能力有限,如有理解错误的地方还望指出。 this是面向对象编程中的一个概念,它一般指向当前方法调用所在的对象,这一点在java、c++这类比较严格的面向对象编程语言里是非常明确的。但是在javascript...

    rottengeek 评论0 收藏0
  • 如何编写避免垃圾开销的实时Javascript代码

    摘要:在语言中我们很难完全避免垃圾开销。它的垃圾收集模式在根本上是不符合像游戏这样的实时软件需求的。此外,在所有可能的情况下避免向量对象如中的和属性。 在 Javascript 语言中我们很难完全避免垃圾开销。它的垃圾收集模式在根本上是不符合像游戏这样的实时软件需求的。在这篇文章中我们主要介绍了一些关于 javascript 垃圾回收的方法。 编辑于 2012 年 3 月 27 日: 哇,这...

    Shisui 评论0 收藏0
  • Pandas数据类型转换的几个技巧

    摘要:利用的一些辅助函数进行类型转换的函数和复杂的自定函数之间有一个中间段,那就是的一些辅助函数。这些辅助函数对于某些特定数据类型的转换非常有用如。 利用Pandas进行数据分析时,确保使用正确的数据类型是非常重要的,否则可能会导致一些不可预知的错误发生。笔者使用Pandas已经有一段时间了,但是还是会在一些小问题上犯错误,追根溯源发现在对数据进行操作时某些特征列并不是Pandas所能处理的...

    luckyw 评论0 收藏0
  • Web前端开发过程踩过的坑以及一些方法技巧(持续更新)

    摘要:一上浏览器使用不允许事件代理到上选择器以上绑定可能会出现点击失效的情况。对于,如果工具是以下版本,在中加入以下代码以上的版本加入以下代码八开发对于文件的处理问题。解决方法有给元素设置绝对定位即可。元素换成内联元素,如。 一、iOS上浏览器使用jQuery不允许事件代理到document上 $(document).on(click, 选择器, function(){}); 以上绑定可能...

    arashicage 评论0 收藏0
  • Web前端开发过程踩过的坑以及一些方法技巧(持续更新)

    摘要:一上浏览器使用不允许事件代理到上选择器以上绑定可能会出现点击失效的情况。对于,如果工具是以下版本,在中加入以下代码以上的版本加入以下代码八开发对于文件的处理问题。解决方法有给元素设置绝对定位即可。元素换成内联元素,如。 一、iOS上浏览器使用jQuery不允许事件代理到document上 $(document).on(click, 选择器, function(){}); 以上绑定可能...

    binta 评论0 收藏0

发表评论

0条评论

GeekQiaQia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<