为了账号安全,请及时绑定邮箱和手机立即绑定

在‘new’操作符中使用.application()。这个是可能的吗?

在‘new’操作符中使用.application()。这个是可能的吗?

一只名叫tom的猫 2019-06-13 19:21:48
在‘new’操作符中使用.application()。这个是可能的吗?在JavaScript中,我希望创建一个对象实例(通过new运算符),但是将任意数量的参数传递给构造函数。这个是可能的吗?我想做的是这样的事情(但下面的代码不起作用):function Something(){     // init stuff}function createSomething(){     return new Something.apply(null, arguments);}var s = createSomething(a,b,c); // 's' is an instance of Something答案从这里的回复中可以清楚地看出,这里没有内置的呼叫方式。.apply()带着new接线员。然而,人们提出了一些真正有趣的解决方案。我更喜欢的解决办法是这张是马修·克鲁姆利写的(我修改了它以通过arguments财产):var createSomething = (function() {     function F(args) {         return Something.apply(this, args);     }     F.prototype = Something.prototype;     return function() {         return new F(arguments);     }})();
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

下面是一个通用的解决方案,它可以调用任何构造函数(除了作为函数调用时行为不同的本机构造函数,如StringNumberDate等等)带有一系列参数:

function construct(constructor, args) {
    function F() {
        return constructor.apply(this, args);
    }
    F.prototype = constructor.prototype;
    return new F();}

通过调用construct(Class, [1, 2, 3])创建的对象是相同的。new Class(1, 2, 3).

您还可以制作一个更具体的版本,这样就不必每次都传递构造函数。这也会稍微提高效率,因为每次调用它时,它都不需要创建内部函数的新实例。

var createSomething = (function() {
    function F(args) {
        return Something.apply(this, args);
    }
    F.prototype = Something.prototype;

    return function(args) {
        return new F(args);
    }})();

创建和调用外部匿名函数的原因是保留函数。F不污染全局命名空间。它有时被称为模块模式。

[最新情况]

对于那些希望在类型记录中使用此方法的人,因为TS给出了一个错误,如果F返回任何内容:

function construct(constructor, args) {
    function F() : void {
        constructor.apply(this, args);
    }
    F.prototype = constructor.prototype;
    return new F();}


查看完整回答
反对 回复 2019-06-13
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

如果您的环境支持ECMA脚本2015的传播运营商(...),您可以这样简单地使用它

function Something() {
    // init stuff}function createSomething() {
    return new Something(...arguments);}

注:现在ECMA脚本2015的规范已经发布,并且大多数JavaScript引擎都在积极地实现它,这将是最好的方法。

您可以在少数几个主要环境中检查扩展操作符的支持,这里.


查看完整回答
反对 回复 2019-06-13
  • 3 回答
  • 0 关注
  • 448 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信