【发布时间】:2015-11-13 20:56:35
【问题描述】:
class Foo {
getName = () => this.name;
setName = (name) => this.name = name;
}
和
class Foo {
get name () {
return this.name;
}
set name (name) {
this.name = name;
}
}
我能想到几个 ES6 getter 处于劣势的例子,例如
您不能编写将基于参数值返回值的 getter:
/**
* Returns an instance of Card associated with an element.
*
* @param {HTMLElement} element
* @return {Card|undefined}
*/
getCard = (element) => {
return _.find(this.index, {
element: element
});
};
没关系,但是,如果您使用 this 和 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 不适用于arrow functions。无效示例:
class Foo {
get name = () => {
return this.name;
}
set name = (name) => {
this.name = name;
}
}
这让他们面临上下文问题。
与传统的 get{PropertyName} 和 set{PropertyName} 抽象相比,使用 ES6 getter 和 setter 有什么优势?
【问题讨论】:
-
嗯,计算属性和设置时的类型/值检查肯定是有用的。如何实现它以及如何使用它取决于您。它是语法糖,不多也不少。您有责任负责任地使用它。
-
这些都不是有效的ES6???请发布显示您实际在做什么的工作代码。
-
@GajusKuizinas:类属性(您的第一个示例)是 第 0 阶段 ES7 提案。
-
那你为什么说“ES6 getter and setter over getProperty/setProperty”*?那宁愿是
class Foo { getFoo() { } }vsclass Foo { get foo() {} }。 -
@GajusKuizinas:这肯定会分散注意力。如果您的问题只是关于 getters(语法)与 getters(约定),那么这与 ES6+ 无关。 ES5 中引入了 Getter。