ES6构造函数对象param的默认值

Dez*_*Dez 7 javascript constructor class ecmascript-6

我试图用定义的构造函数定义一个Javascript类,其中params具有最合适的ES6语法.首先,很容易像这样定义它.

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

但是当我尝试使用解构来定义默认值时,对于构造函数的一个参数(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);
Run Code Online (Sandbox Code Playgroud)

我应该期待的是,当使用console.log(test.options.op2)print打印时,在构造函数中设置默认值,但我正在接受undefined.

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

Ber*_*rgi 13

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

constructor({id = 'defaultId', options = { op2:'0'}} = {}){
Run Code Online (Sandbox Code Playgroud)

对于构造函数的一个参数(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};
}
Run Code Online (Sandbox Code Playgroud)