JS ES6类的构造函数行为

时间:2018-03-18 11:48:59

标签: javascript node.js es6-class

我对ES6类中的构造函数有疑问。

我定义了以下类游戏:

module.exports = class Game {constructor() {}};

现在我创建一个这样的实例。有和没有参数:

let Game = require('./lib/models/game'); console.log(new Game());console.log(new Game(1,2,3));

如果我用params创建一个实例,我没有错误或异常。 原因是什么?

1 个答案:

答案 0 :(得分:4)

因为JavaScript函数不会检查您在调用它们时提供的参数数量是否与形式参数的数量相同。这不仅适用于构造函数,它对所有函数都适用。 (当然,除非将明确的代码添加到函数中以进行检查。)

如果你提供的参数多于形式参数,你可以通过特殊的arguments伪数组访问它们(但请继续阅读):



function foo() {
    for (let i = 0; i < arguments.length; ++i ) {
        console.log(`arguments[${i}] =`, arguments[i]);
    }
}
foo("a", "b");
&#13;
&#13;
&#13;

输出:

arguments[0] = a
arguments[1] = b

同样,如果您声明了形式参数,并且未给出它们的值,则它们的值将为undefined.

&#13;
&#13;
function foo(arg) {
    console.log("arg:", arg);
}
foo();
&#13;
&#13;
&#13;

输出:

arg: undefined

arguments过去常用于变量参数列表;但是从ES2015开始,转向使用rest参数:

&#13;
&#13;
function foo(a, ...rest) {
    console.log("a = ", a);
    for (let i = 0; i < rest.length; ++i ) {
        console.log(`rest[${i}] =`, rest[i]);
    }
}
foo("a", "b", "c");
&#13;
&#13;
&#13;

输出:

a = a
rest[0] = b
rest[1] = c