类构造函数

时间:2018-02-13 20:39:10

标签: javascript node.js

我已经创建了一个类,我希望在用户不提供任何参数的情况下为值设置一些默认选项。我最近从一个带有多个参数的构造函数转到了一个对象,因为我相信当用户创建一个新的类实例时,它有助于提高可读性。

以下是我以前的做法:

module.exports = class User {
    constructor(name = "Joe", age = 47) {
        this.name = name;
        this.age = age;
    }
}

const User = require("./user");

const user = new User(); // Defaults to "Joe" and 47

实际上,我的班级有更多的参数,使用它时的可读性变得很难。所以为了解决这个问题,我切换到一个工作得更好的选项对象,但我似乎无法设置默认值。当我尝试使用this.name时它会显示this.name = options.name || "Joe" Cannot read property 'name' of undefined,即使我认为我将默认值设置为“Joe”

以下是我现在正在做的事情:

module.exports = class User {
    constructor(options) {
        this.name = options.name || "Joe";
        this.age = options.age || 47;
    }
}

const User = require("./user");

const user = new User();

4 个答案:

答案 0 :(得分:2)

确保您拥有对象本身的默认值。

module.exports = class User {
    constructor(options) {
        options = options || {}
        this.name = options.name || "Joe";
        this.age = options.age || 47;
    }
}

答案 1 :(得分:2)

您可以为选项设置默认值,即{}

class User {
    constructor(options = {}) {
        this.name = options.name || "Joe";
        this.age = options.age || 47;
    }
}

或首先检查options是否真实,然后访问该值。

class User {
    constructor(options) {
        this.name = options && options.name || "Joe";
        this.age = options && options.age || 47;
    }
}

答案 2 :(得分:2)

你实际上只需要一个oneliner:

const defaultUser = {
  name: "Joe",
  age: 47
};

module.exports = class User {
  constructor(options) {
     Object.assign(this, defaultUser,  options)
  }
}

答案 3 :(得分:0)

如果要更改为配置模式,仍可以保留默认参数语法:

module.exports = class User {
    constructor({ name = "Joe", age = 47 } = {}) {
        this.name = name;
        this.age = age;
    }
}

const User = require("./user");

const user = new User(); // Defaults to "Joe" and 47