gpt4 book ai didi

javascript - ES5 getters 和 setters 是 "potentially surprising and difficult to reason about"

转载 作者:行者123 更新时间:2023-11-29 17:52:22 25 4
gpt4 key购买 nike

我引用最近的Google JavaScript Style Guide :

Do not use JavaScript getter and setter properties. They are potentially surprising and difficult to reason about, and have limited support in the compiler. Provide ordinary methods instead.

Exception: when working with data binding frameworks (such as Angular and Polymer), getters and setters may be used sparingly. Note, however, that compiler support is limited. When they are used, they must be defined either with get foo() and set foo(value) in the class or object literal, or if that is not possible, with Object.defineProperties. Do not use Object.defineProperty, which interferes with property renaming. Getters must not change observable state.

Illegal:

class Foo {
get next() { return this.nextId++; }
}

这是 Google 的意见,但我想真正了解原因。

首先,我认为支持有限的 “编译器” 是 Babel/Traceur/TypeScript?还是某些 ES5 引擎缺乏支持?

此外,我想了解一下作者认为的“令人惊讶和困难”的原因是什么。我看到了这些限制:

  1. Object.assign() 不复制 getter,而是执行它们并复制值;
  2. 使用 get name() 语法,不可能向现有对象添加 getter。对于现有对象,必须使用 Object.defineProperty
  3. 不可能用 lambda 定义 getter,这种限制会导致我们在某些情况下使用老式的 let that = this

我不明白声明:Object.defineProperty interferences with property renaming”。 (什么是“属性重命名”?)

最佳答案

我猜他们的意思是:

"[potentially] surprising":

具有 getter 和 setter 的属性不一定像普通属性一样。因此,他们违反了 principle of least surprise .假设您有一个属性,如果分配给它的值为负数,则该属性返回 0:

myObj.prop = -7;
expect(myObj.prop).to.equal(-7); // fails

"[potentially] difficult to reason about":

出于类似的原因。具有 getter 和 setter 的属性不一定像普通属性那样工作,这意味着您不一定能像对待普通属性那样对它们进行推理。

假设我们再次拥有上述属性。您不能执行以下操作:

myObj.prop = -7;

console.log(myObj.prop * 9);

// use substitution to figure out the result of the above statement:

console.log(-7 * 9); // substitute -7 for myObj.prop
console.log(-63); // wrong - the above actually logs 0

关于属性重命名:根据this question ,Closure 编译器中的优化器尝试重命名(缩小)属性名称,但它会通过重命名对它们的引用而不是更新 .defineProperty() 调用以不完整的方式这样做。使用 .defineProperties() 允许优化器正确重命名属性。

关于javascript - ES5 getters 和 setters 是 "potentially surprising and difficult to reason about",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42331251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com