2016-11-17 3 views
4

Я пытаюсь определить класс Javascript с определенным конструктором с параметрами с самым правильным синтаксисом ES6. Сначала это легко определить.ES6 конструктор object param значения по умолчанию

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);

Но когда я пытаюсь использовать деструктурирующие для определения значений по умолчанию для одного из Params из конструктора (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.

Также я хотел бы знать, есть ли более подходящий синтаксис ES6 при определении классов javascript для инициализации параметров класса.

+2

'{ид = ' defaultId ', options = {op2:' 0 '}} = {} 'Вы устанавливаете объект в пустой объект? –

+1

@KevinKloet Нет, он использует пустой объект по умолчанию, если аргумент не указан. – Bergi

ответ

8

Но когда я пытаюсь использовать деструктурирующие для определения значений по умолчанию

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

для одного из Params из конструктора (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}; 
} 
+0

И это то, что было моим вопросом. Отсутствие знания о необходимости разрушения на каждом уровне, а не только на верхнем уровне. – Dez

2

Фактически вы не можете добавлять недостающие свойства к объекту, поскольку он никогда не добавляется, потому что объект options не отбрасывает значения по умолчанию. В этом particaular сценарии было бы гораздо проще идти по этому пути:

class Test { 

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

} 
+2

Не используйте '||' для установки значения по умолчанию, см. [Что делает конструкция x = x || y mean?] (http://stackoverflow.com/a/34707750/3853934) –

+0

@Alex Быков, если я хорошо вас понял, если то, что вы заявляете, верно, в моем втором примере параметр 'id' не получил бы значение по умолчанию назначено правильно, так как оно выполняется, как ожидалось, потому что оно отсутствует в объекте 'props' – Dez

Смежные вопросы