猿问

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

在‘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);
    }})();


一只名叫tom的猫
浏览 449回答 3
3回答

白猪掌柜的

下面是一个通用的解决方案,它可以调用任何构造函数(除了作为函数调用时行为不同的本机构造函数,如String, Number, Date等等)带有一系列参数: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();}

慕田峪7331174

如果您的环境支持ECMA脚本2015的传播运营商(...),您可以这样简单地使用它function Something() {     // init stuff}function createSomething() {     return new Something(...arguments);}注:现在ECMA脚本2015的规范已经发布,并且大多数JavaScript引擎都在积极地实现它,这将是最好的方法。您可以在少数几个主要环境中检查扩展操作符的支持,这里.
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答