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

Javascript 类构造函数中选项对象的默认值,javascript,node.js,Javascript,Node.js,我已经创建了一个类,我想为值设置一些默认选项,以防用户不提供任何参数。我最近使用了一个构造函数,它将多个参数带到一个对象中,因为我相信当用户创建类的新实例时,它有助于提高可读性 我以前是这样做的: module.exports = class User { constructor(name = "Joe", age = 47) { this.name = name; this.age = age; } } const User = require

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

我以前是这样做的:

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
module.exports = class User {
    constructor(options) {
        this.name = options.name || "Joe";
        this.age = options.age || 47;
    }
}

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

const user = new User();
实际上,我的类有更多的参数,使用它时的可读性变得很难。所以为了解决这个问题,我切换到一个选项对象,它工作得更好,但我似乎无法设置默认值。当我尝试使用
this.name
时,它会显示
this.name=options.name | | |“Joe”无法读取未定义的属性“name”
,即使我认为我已将默认值设置为“Joe”

我现在是这样做的:

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
module.exports = class User {
    constructor(options) {
        this.name = options.name || "Joe";
        this.age = options.age || 47;
    }
}

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

const user = new User();

确保对象本身具有默认值

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

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

class User {
    constructor(options = {}) {
        this.name = options.name || "Joe";
        this.age = options.age || 47;
    }
}
或者首先检查
选项是否真实,然后访问该值

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

实际上,您只需要一个oneliner:

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

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

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

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

选项
未定义,您正在尝试访问
未定义。名称
。您可以在构造函数的签名中为
options
设置默认值
{}
。好的,我想我现在明白了,如果在初始化类时没有指定options,它不存在,所以这就是抛出错误的原因?您可能不希望将
选项设置为实例-variable@clentfort我想我以前见过这样做,但当时我不明白。这个方法和你答案中的第一个方法有什么不同?我的第一个答案使用了新的语言特性,这是“经典”的方式。如果要使用此代码,请注意将
options
指定给实例变量
options
,这样就可以通过
this.options
在任何地方使用它。这可能不是我想要的。@clentfort我已经更新了答案。谢谢你的评论。这是ES6的方式,非常好。您还可以使用destructuring从
选项中提取变量(这是我正在等待的:P使用默认参数进行对象destructuring:D)