类构造函数中选项对象的默认值

Mr.*_*yyy 4 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
Run Code Online (Sandbox Code Playgroud)

事实上,我的类有更多的参数,并且使用它时的可读性变得很困难。因此,为了解决这个问题,我切换到了一个效果更好的选项对象,但我似乎无法设置默认值。当我尝试使用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();
Run Code Online (Sandbox Code Playgroud)

Jon*_*lms 7

你实际上只需要一条线:

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

module.exports = class User {
  constructor(options) {
     Object.assign(this, defaultUser,  options)
  }
}
Run Code Online (Sandbox Code Playgroud)


Pat*_*rts 6

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

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
Run Code Online (Sandbox Code Playgroud)


cle*_*ort 5

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

class User {
    constructor(options = {}) {
        this.name = options.name || "Joe";
        this.age = options.age || 47;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class User {
    constructor(options) {
        this.name = options && options.name || "Joe";
        this.age = options && options.age || 47;
    }
}
Run Code Online (Sandbox Code Playgroud)