class Foo {
getName = () => this.name;
setName = (name) => this.name = name;
}
и
class Foo {
get name () {
return this.name;
}
set name (name) {
this.name = name;
}
}
Я могу представить несколько примеров, в которых получатели ES6 находятся в невыгодном положении, например
Вы не можете записать получателя, который вернет значение, основанное на значении параметра:
/**
* Returns an instance of Card associated with an element.
*
* @param {HTMLElement} element
* @return {Card|undefined}
*/
getCard = (element) => {
return _.find(this.index, {
element: element
});
};
Однако, если вы используете это и ES6, вы вводите несогласованность в стиле кода.
Вы не можете различать прямой доступ к свойствам и доступ к методу.
class Foo {
get name () {
return this.name;
}
get expensive () {
// An operation that takes a lot of computational power.
}
get randomValue () {
// Returns random value.
}
}
let foo = Foo();
foo.name;
foo.expensive;
foo.randomValue;
Недостаток заключается в том, что не интуитивно понятно, что для свойства, к которому вы обращаетесь, может потребоваться большая вычислительная мощность (и, следовательно, его следует помнить) или что он изменяется каждый раз, когда вы обращаетесь к нему.
Наконец, getters/seters не работают с функциями стрелок. Недопустимый пример:
class Foo {
get name = () => {
return this.name;
}
set name = (name) => {
this.name = name;
}
}
который подвергает их проблемам контекста.
Что такое преимущество использования получателей и сеттеров ES6 по сравнению с обычной абстракцией get{PropertyName}
и set{PropertyName}
?