1
class Person {
   constructor(){}

   set name(){

   }

   // delete get name() {} 
}

您可以禁用属性的吸气剂吗?会有意想不到的后果吗?我应该扔吗?返回未定义?

4

2 回答 2

2

如果你有你在那里定义的类,没有 getter name; 试图从will yieldname的实例中读取(好像根本没有为实例定义)。这是由规范中的抽​​象操作定义的,它说如果一个属性是访问器属性但它的操作是,那么获取该属性的结果是。(更多内容如下。)PersonundefinednameOrdinaryGetgetundefinedundefined

如果你想尝试读取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);

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

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

现在你可能会想“这就像对象没有name属性一样,对吧?” 但不,不是。该对象具有属性,只是没有吸气剂。

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

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

于 2016-12-01T18:11:55.770 回答
0

我会throw在 getter 中有一个例外,以避免无意的不正确使用。

于 2016-12-01T18:10:58.543 回答