2015-07-10 5 views
7

Возможно ли создать класс ES6, который присваивает значение по умолчанию для свойства, если оно не передано новым методом?ES6 Классы Значение по умолчанию

class myClass { 
    constructor(options) { 
     this.a = typeof options.a !== 'undefined' ? options.a : 'default a value'; 
     this.b = typeof options.b !== 'undefined' ? options.b : 'default b value'; 
     this.c = typeof options.c !== 'undefined' ? options.c : 'default c value'; 
    } 
} 

var myClassWithValue = new myClass({a:'a value', b: 'b value'}); 

Если я пытаюсь сделать это с помощью этого кода, компиляции с babeljs, я получаю TypeError: Невозможно установить свойство «С» не определено.

Возможно, я не понимаю, как работают классы в javascript.

+0

Если он не может прочитать свойство '' c' из undefined', это означает, что все, что должно иметь свойство 'c' ** есть **' undefined'. Это означает, что в вашем случае 'options' не определено. –

+0

Но это то, чего я хочу. Если я не передаю значение c в параметрах, он создает новый объект со значением по умолчанию для c –

+1

. Ваш код в порядке, вы можете скопировать/вставить его [здесь] (https://babeljs.io/repl/) и посмотреть. – Engineer

ответ

9

Если вы собираетесь использовать ES6, почему бы не использовать все ES6, т.е. значения по умолчанию для параметров и деструктурирующего присвоения

class myClass { 
    constructor({a = 'default a value', b = 'default b value', c = 'default c value'} = {a:'default option a', b:'default option b', c:'default option c'}) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    } 
} 
var v = new myClass({a:'a value', b: 'b value'}); 
console.log(v.toSource()); 
var w = new myClass(); 
console.log(w.toSource()); 

http://www.es6fiddle.net/ibxq6qcx/

редактировать: также проверена и подтверждена для запуска на https://babeljs.io/repl/

+0

Ницца. Не знал о назначении деструктуризации. Это решение, которое я искал. –

+0

Это не назначение деструктуризации. Кстати, вы, вероятно, не хотите двух разных значений по умолчанию. – Bergi

+2

@ Bergi, что это? –

3

Я хотел бы предложить следующее:

class myClass { 
    constructor(options) { 
    const defaults = { 
     a: 'default a value', 
     b: 'default b value', 
     c: 'default c value' 
    }; 
    const populated = Object.assign(defaults, options); 
    for (const key in populated) { 
     if (populated.hasOwnProperty(key)) { 
     this[key] = populated[key]; 
     } 
    } 
    } 
} 

var myClassWithValue = new myClass({a:'a value', b: 'b value'}); 
+0

Это работает. Спасибо –

+0

@LeonardoAlves, предполагая, что вы используете обновленную версию Babel, она должна преобразовывать 'const' в' var' правильно в преобразованном коде. –

+0

Спасибо, что вышло. Посмотрите. –

1

TypeError: Cannot set property 'c' of undefined.

Это означает, что options не определено.

Убедитесь, что options объект существует, первый:

if(options){ 
    this.a = typeof options.a !== 'undefined' ? options.a : 'default a value'; 
    this.b = typeof options.b !== 'undefined' ? options.b : 'default b value'; 
    this.c = typeof options.c !== 'undefined' ? options.c : 'default c value'; 
}else{ 
    this.a = 'default a value'; 
    this.b = 'default b value'; 
    this.c = 'default c value'; 
} 

Или, красиво и коротко:

options = options || {}; 
this.a = typeof options.a !== 'undefined' ? options.a : 'default a value'; 
this.b = typeof options.b !== 'undefined' ? options.b : 'default b value'; 
this.c = typeof options.c !== 'undefined' ? options.c : 'default c value'; 
+0

Разве эта ошибка не означает, что 'this' не определено? 'options.c' никогда не устанавливается *. – Bergi

0

Я просто задал подобный вопрос и нашел этот вопрос после того, как я пришел с решением, поэтому я думал, что я отправлю его здесь.

Мой вопрос касался ES6 и использования деконструкции для установки параметров по умолчанию для класса. Кажется, спецификация не позволяет вам напрямую деконструировать аргументы, если вы не делаете что-то похожее на то, что сделал @Jaromanda X.

Я хотел что-то короче и чище, и в конечном итоге, используя следующую закономерность:

class Test { 
    constructor(options) { 
     let { 
     defaultOne : defaultOne = 'default one value', 
     defaultTwo : defaultTwo = 'default two value', 
     defaultThree : defaultThree = 'default three value' 
     } = (options) ? options:{}; 

     this.defaultOne = defaultOne; 
     this.defaultTwo = defaultTwo; 
     this.defaultThree = defaultThree; 

     this.init(); 
    } 

    init() { 
    console.log(this.defaultOne); 
    console.log(this.defaultTwo); 
    console.log(this.defaultThree); 
    } 
} 

new Test({defaultOne: 'Override default one value'}); 
new Test(); 

ES6 Babel test

Compiled Babel ES5

Все, что мы делаем здесь деконструкции аргумент опции, и мы обрабатывать неопределенный прецедент с тройным.

3

Object.assign работает для меня, как хорошо

class RenderProperties { 
    constructor(options = {}){ 
     Object.assign(this, { 
      fill : false, 
      fillStyle : 'rgba(0, 255, 0, 0.5)', 
      lineWidth : 1, 
      strokeStyle : '#00FF00' 
     }, options); 
    } 
} 
+0

Это отлично подойдет для меня. Спасибо, что разместили этот маленький камень. –

0

Более короткие и уборщик версия, основанная на Default parameters from MDN web docs.

class myClass { 
 
    constructor(
 
    a = 'default a value', 
 
    b = 'default b value', 
 
    c = 'default c value' 
 
) { 
 
     this.a = a; 
 
     this.b = b; 
 
     this.c = c; 
 
    } 
 
} 
 

 
let myClassWithValue = new myClass('a value','b value'); 
 

 
console.log(myClassWithValue);

с передачей объекта.

class myClass { 
 
    constructor({ 
 
    a = 'default a value', 
 
    b = 'default b value', 
 
    c = 'default c value' 
 
    }) { 
 
     this.a = a; 
 
     this.b = b; 
 
     this.c = c; 
 
    } 
 
} 
 

 
let options = { 
 
    a: 'a value', 
 
    b: 'b value' 
 
} 
 

 
let myClassWithValue = new myClass(options); 
 

 
console.log(myClassWithValue);

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