在 ES6 class 中禁用 getter?

Disabling a getter in an ES6 class?

class Person {
   constructor(){}

   set name(){

   }

   // delete get name() {} 
}

您可以为 属性 禁用 getter 吗?是否有意想不到的后果?我应该扔吗? Return未定义?

我会 throw getter 中的一个例外,以避免无意的错误使用。

如果您有您在此处定义的 class,那么 name 没有 getter;尝试从 Person 的实例读取 name 将产生 undefined (就好像根本没有为该实例定义 name 一样)。这是由规范中的 OrdinaryGet abstract operation 定义的,它表示如果 属性 是访问器 属性 但其 get 操作是 undefined,则结果得到 属性 是 undefined。 (更多内容见下文。)

如果你想让尝试读取 name 成为一个错误,那么是的,实现一个 getter 并抛出。

两者的例子:

class NoError {
  set name(value){
  }
}
let n = new NoError();
console.log(n.name);

class HasError {
  get name() {
    throw new Error("'name' cannot be read");
  }
  set name(value){
  }
}
let h = new HasError();
console.log(h.name);

这是一个不使用 classes 的简单示例:

var obj = {
  set name(value) {
  }
};
console.log(obj.hasOwnProperty("name")); // true
console.log(obj.name);                   // undefined

现在您可能会想 "That's acting like the object doesn't have a name property, right?" 但不,不是。对象有 属性,只是没有 getter.

如果它表现得好像没有 属性,JavaScript 引擎会查看原型来找到它,我们可以从规范中看到 link上面和这个例子中它没有:

var proto = {
  name: "Name on prototype"
};
var obj = Object.create(proto, {
  name: {
    set(value) {
    }
  }
});
console.log(obj.hasOwnProperty("name")); // true
console.log(obj.name);                   // undefined