我正在尝试使用带有最合适的ES6语法的params定义构造函数来定义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语法。
答案 0 :(得分:13)
但是当我尝试使用解构来定义默认值时
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};
}
答案 1 :(得分:2)
您实际上无法向对象添加缺少的属性,因为它从未添加,因为选项对象不会回退到默认值。在这个特殊情况下,采用这种方式会更加简单:
class Test {
constructor({id = 'defaultId', options= { op2:'0'}} = {}){
this.id = id;
this.options = options;
this.options.op2 = this.options.op2 || '0';
}
}