JavaScript new this.constructor(); =>元素列表后面的SyntaxError:missing]

时间:2017-09-15 17:42:10

标签: javascript ecmascript-6

我有一些课程:

class Sample{
    static createSelf() {
        return new this.constructor(1, 2);
    }
}

class AnotherClass extends Sample {
    constructor(a, b) {
        this.c = a+b;
    }
}

ac = AnotherClass.createSelf();

我该怎么做?

这个具体的例子给了我SyntaxError: missing formal parameter,虽然在我的原始代码(500行)中,当我有new this.constructor()时,我得到SyntaxError: missing ] after element list指向第一行(形式参数错误)也指向第1行)。我知道这是因为这一行,因为当我用普通的类名替换它时,它可以工作。没有数组初始化关闭。错误不可能意味着:

  

某处的数组初始化程序语法出错。可能有一个结束括号("]")或逗号(",")缺失。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Missing_bracket_after_list

UPDATE 原始代码:

class Participant {
    constructor(origin, destination, number, startDate, endDate) {
        ...
    }

    static restore(save) {
        const participant = new this.constructor(
            new Marker(save.originLocation, this.getMarkerOptions(true, save.isDriver, save.number)).addTo(map),
            new Marker(save.destinationLocation, this.getMarkerOptions(false, save.isDriver, save.number)).addTo(map),
            save.number,
            save.startDate,
            save.endDate
        );

        return participant;
    };
}

class Driver extends Participant {}

d = Driver.restore(saveObject);

1 个答案:

答案 0 :(得分:4)

如果错误指向第一行,则语法错误之前您在此处发布的代码。

原因是这个错误的原因是this.constructor引用了Function,它将评估作为代码传递给它的一个参数。由于您没有将JavaScript代码传递给它,因此您会收到语法错误。

示例(打开浏览器的控制台):



new Function({});




但是,您在此处发布的代码也存在两个问题。

静态方法中的

this

this的值取决于函数的调用方式。静态方法被称为构造函数函数的方法,因此this引用构造函数。在您的示例中,使用AnotherClass.createSelf();this引用AnotherClass。因此this.constructor引用Function。我不认为这就是你想要的。我想你想要

class Sample{
    static createSelf() {
        return new this(1, 2);
    }
}

看起来您认为this会引用该类的实例,但它怎么可能呢?你还没有创建一个。

this内部构造函数

当一个类扩展另一个类时,始终必须在构造函数内调用super()才能访问this

class AnotherClass extends Sample {
    constructor(a, b) {
        super();
        this.c = a+b;
    }
}