2015-02-12 3 views
2

Учитывая класс ES6 следующим образом, каков наилучший способ сохранить ссылку на данные, переданные в конструктор, чтобы они были доступны из методов экземпляра?Как мне сохранить ссылку на объект «options» в экземпляре ES6?

Лучшее, что я нашел до сих пор, - это вручную добавить ссылку на каждый экземпляр некоторого свойства экземпляра внутри конструктора. Есть ли более чистый/более простой способ?

class Test { 

    constructor({ 
    option1 = 1, 
    option2 = 2 
    } = {}) { 

    // What's the best way to keep a reference to 
    // the options on the instance? 
    this.options = { 
     option1, 
     option2 
    }; 
    } 

    addOptions() { 
    return this.options.option1 + this.options.option2; 
    } 
} 

let t = new Test({ 
    option1: 5 
}); 

console.log(t.addOptions()); // 7 

Вот ссылка на above code работает через 6to5.

ответ

2

ES6 не позволяет объявлять свойства прототипа в объявлениях классов, которые немного больны ... Однако использование getter для возврата значений по умолчанию может быть хорошим для вашей ситуации. Может быть, попробовать что-то вроде этого:

class Test { 
    get defaults() { return { option1: 1, option2: 2 }; } 

    constructor(parameters) { 
    this.options = Object.assign({}, this.defaults, parameters) 
    } 

    doSomething() { 
    return this.options.option1 + this.options.option2; 
    } 
} 

let test = new Test({ 
    option1: 5 
}); 

console.log(test.doSomething()); 

Вот ссылка на above code running on 6to5 REPL. Если вам нужен пример слияния значений по умолчанию с наследованием, посмотрите на constructor of this class.

+0

* «ES6 не позволяет свойства экземпляра» *? Что такое 'this.options'? –

+2

@FelixKling Ahh, я должен был быть немного яснее; ES6 не позволяет объявлять свойства прототипа в объявлении класса: http://wiki.ecmascript.org/doku.php?id=strawman:maximally_minimal_classes –

+0

@AndrewOdri - Спасибо, есть несколько хороших идей здесь и внутри этого tungstenjs repo you связанный с. Как вы уже упоминали, это несколько раздражает то, что синтаксис объявления нового класса не позволяет использовать методы экземпляра. Я никогда не был уверен, почему, но, видимо, это было [явно принято решение] (https://stackoverflow.com/questions/22528967/es6-class-variable-alternatives). –

0

Поскольку вы разрушаете первый аргумент и не имеете именованной ссылки для него, как насчет this.options = arguments[0]?

Если вы не хотите, чтобы внешние функции изменяли его, вы могли бы глубоко заморозить его.

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

Чтобы получить значения по умолчанию, которые можно использовать вместо этого:

const defaults = {...} 

function(options) { 
    this.options = Object.assign({}, defaults, options) 
    // now destructure to local vars as needed 
    ... 
} 

Осторожно: Object.assign просто неглубоко слияния.

+0

Объект в 'arguments [0]', похоже, не получает, например. Свойство 'option2', если используется значение по умолчанию вместо того, чтобы быть переданным. В противном случае это сработает. Кроме того, существует ли более чистый способ предоставления значений по умолчанию для аргумента объекта без его разрушения? –

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