2017-01-24 2 views
-2

Как использовать значение переменной для установки свойства класса в ES2015?Установка `this. [Variable value]` в ES2015

Рассмотрим этот код:

class Test { 
    constructor() { 
    this.name = ""; 
    this.url = ""; 
    } 

    //Set the options for class 
    setOptions(options) { 
    for (option in options) { 
     this.option = options[option]; //Option 1 
     this[option] = options[option]; //Option 2 
    } 
    } 
} 

const test = new Test(); 
test.setOptions({name: 'Test', url: 'www.stackoverflow.com'}); 

Я знаю, что вариант 1 не должен работать, но, видя, как если бы Вариант 2 также не работает, я не знаю, как я должен задавать атрибуты класса программно.

Чтобы это было абсолютно ясно, я хочу установить «имя» и «url» в классе, а не свойство, называемое опцией.

+1

Как только вы исправите объявление переменной 'option', оно работает отлично. https://jsfiddle.net/popyL5dq/ Почему вы думаете, что это не работает? Какой результат вы получаете? –

+0

* Не работает * Не работает как? Посмотрите на консоль. Вероятно, вы увидите «ReferenceError» в переменной «option». Это должно дать вам все ключи, необходимые для отслеживания ошибки. –

+0

Это не имеет никакого отношения к ES2015. Это основное JS. –

ответ

1

Ошибка в синтаксисе for...in. option не определен, вы должны будете использовать for(var option in options) или for(let option in options)

При входе test после этого, с помощью опции 2, выход:

Test {name: "Test", url: "www.stackoverflow.com"}

class Test { 
 
    constructor() { 
 
    this.name = ""; 
 
    this.url = ""; 
 
    } 
 

 
    //Set the options for class 
 
    setOptions(options) { 
 
    for (let option in options) { 
 
     this[option] = options[option]; //Option 2 
 
    } 
 
    } 
 
} 
 

 
const test = new Test(); 
 
test.setOptions({name: 'Test', url: 'www.stackoverflow.com'}); 
 

 
console.log(test);

Как было предложено jfriend00, вы также можете просто использовать Object.assign:

class Test { 
 
    constructor() { 
 
    this.name = ""; 
 
    this.url = ""; 
 
    } 
 

 
    //Set the options for class 
 
    setOptions(options) { 
 
    Object.assign(this, options); 
 
    } 
 
} 
 

 
const test = new Test(); 
 
test.setOptions({name: 'Test', url: 'www.stackoverflow.com'}); 
 

 
console.log(test);

+0

Невероятно .. У меня это исправлено в моем фактическом коде, но не думал, что это будет большой проблемой, потому что это будет просто «глобальная» переменная JS, поэтому не повторилось после добавления в нее. выберите ваш как лучший ответ, как только stackoverflow позволяет мне – Denno

+3

Или, может быть, просто используйте 'Object.assign()' и пусть он скопирует все свойства. – jfriend00

+0

+1 для 'Object.assign', но имейте в виду, что это может сделать неприятные вещи, если у вас есть другие именованные свойства на вашем объекте, и объект передается с любыми именами свойств. – lonesomeday

-1

ES6 классы находятся в строгом режиме даже без "use strict".

Строгий режим запрещает неявные глобальные переменные.

option переменная не объявлена ​​нигде.

Таким образом, попытка присвоить ему какое-то значение будет вызывать ReferenceError.

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