【问题标题】:Disabling a getter in an ES6 class?在 ES6 类中禁用吸气剂?
【发布时间】:2016-12-01 18:08:11
【问题描述】:
class Person {
   constructor(){}

   set name(){

   }

   // delete get name() {} 
}

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

【问题讨论】:

  • 在您首先声明一个吸气剂之前没有吸气剂?试试看:(new Person).name!

标签: javascript ecmascript-6 es6-class


【解决方案1】:

如果你有你在那里定义的类,那么没有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);

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

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

现在您可能会想“这就像对象没有 name 属性一样,对吧?”但不,不是。对象有属性,只是没有getter。

如果它表现得好像没有该属性,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

【讨论】:

  • 感谢深思熟虑的回答。但是,我将 JSHint 错误与 javascript 错误混淆了。将警告静音或通过抛出来执行它会更明智吗?
  • @MathieuBertin:这取决于你。 :-) 如果您想读取要抛出的属性,请实现一个抛出的 getter;如果您希望它导致未定义,请使警告/错误静音。
【解决方案2】:

我会在 getter 中 throw 一个异常以避免无意的错误使用。

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 2017-04-19
    • 2019-11-26
    • 2018-11-16
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多