【问题标题】:ES6 constructor object param default valuesES6 构造函数对象参数默认值
【发布时间】:2017-04-01 00:23:49
【问题描述】:

我正在尝试用最合适的 ES6 语法定义一个带有已定义构造函数的 Javascript 类。一开始,这样定义很容易。

let param1 = 10;
let param2 = 'foo';
let param3 = 200;
let param4 = 'bar';

let props = {id: param1, options: { op1: param2, op2: param3, op3: param4 }};

console.log('Object props');
console.log(props);

class Test {
  
  constructor(props){
    this.id = props.id;
    this.options = props.options;
  }
  
}

let test1 = new Test(props);
console.log('Class test1');
console.log(test1.id);
console.log(test1.options.op2);

但是当我尝试使用解构来定义默认值时,对于构造函数的一个参数(op2,嵌套对象options 的属性),我无法使其工作,而对于我能够的对象的id 属性:

let param1 = 10;
let param2 = 'foo';
let param3 = 200;
let param4 = 'bar';

let props = {options: { op1: param2, op3: param4 }};

console.log('Object props');
console.log(props);

class Test {
  
  constructor({id = 'defaultId', options = { op2:'0'}} = {}){
    this.id = id;
    this.options = options;
  }
  
}

let test = new Test(props);
console.log('Class test');
console.log(test.id);
console.log(test.options);
console.log(test.options.op2);

我应该期待的是,当使用console.log(test.options.op2) 进行调试时,会打印构造函数中设置的默认值,但我却得到了undefined

另外我想知道在定义 javascript 类来初始化类参数时是否有更合适的 ES6 语法。

【问题讨论】:

  • {id = 'defaultId', options = { op2:'0'}} = {}你正在将一个对象设置为一个空对象?
  • @KevinKloet 不,如果没有提供参数,它将使用空对象作为默认值。

标签: javascript class constructor ecmascript-6


【解决方案1】:

但是当我尝试使用解构来定义默认值时

constructor({id = 'defaultId', options = { op2:'0'}} = {}){

对于构造函数的其中一个参数(op2,嵌套对象选项的属性),我无法使其工作,而对于对象的 id 属性,我可以。

默认值仅适用于单个参数/属性级别。如果没有参数或undefined 被传递,{} 将用于第一个参数。如果对象没有id 属性,则将使用'defaultId'。如果对象没有options 属性,则将使用{op2:'0'}。如果您确实传递了具有options 属性的对象,则默认值将被忽略。

因此,如果您想要对象的op2 属性的默认值,如果在对象中没有找到此类属性,则需要对options 对象本身使用解构:

constructor({id = 'defaultId', options: {op1, op2 = '0', op3} = {}} = {}) {
    this.id = id;
    this.options = {op1, op2, op3};
}

【讨论】:

  • 这就是我的问题所在。不知道需要在每个嵌套级别进行解构,而不仅仅是在顶层。
【解决方案2】:

您实际上无法向对象添加缺少的属性,因为它从未添加,因为选项对象不会回退到默认值。在这种特殊情况下,这样做会更简单:

class Test {

  constructor({id = 'defaultId', options= { op2:'0'}} = {}){
    this.id = id;
    this.options = options;
    this.options.op2 = this.options.op2 || '0';
  }

}

【讨论】:

  • 不要使用||设置默认值,见What does the construct x = x || y mean?
  • @Alex Bykov 如果我理解你的话,如果你说的是真的,在我的第二个例子中,参数id 不会得到正确分配的默认值,因为它正在按预期完成,因为它在对象props 中缺失
猜你喜欢
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多