class Foo {
getName = () => this.name;
setName = (name) => this.name = name;
}
和
class Foo {
get name () {
return this.name;
}
set name (name) {
this.name = name;
}
}
我可以举出几个ES6 getters劣势的例子,例如:
您无法编写一个getter函数,根据参数值返回一个值:
/**
* 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;
缺点是,您可能无法直观地知道您正在访问的属性可能需要大量计算功率(因此应该进行记忆化),或者每次访问它时都会更改。
最后,getter/setter 与箭头函数不兼容。无效示例:
class Foo {
get name = () => {
return this.name;
}
set name = (name) => {
this.name = name;
}
}
这使它们暴露于上下文问题。
相对于传统的 get {PropertyName}
和 set {PropertyName}
抽象,使用ES6 getter和setter的优势是什么?
class Foo { getFoo() { } }
与class Foo { get foo() {} }
的区别。 - Felix Kling