禁用ES6类中的getter?

时间:2016-12-01 18:08:12

标签: javascript ecmascript-6 es6-class

class Person {
   constructor(){}

   set name(){

   }

   // delete get name() {} 
}

你可以禁用属性的getter吗?是否有意想不到的后果?我应该扔吗?返回undefined?

2 个答案:

答案 0 :(得分:2)

如果您已经在课堂上定义了课程,那么 就没有name的获取者;尝试从name的实例中阅读Person将会产生undefined(好像name根本没有为该实例定义)。这是由规范中的OrdinaryGet abstract operation定义的,它表示如果属性是访问者属性但其get操作是undefined,则获取属性的结果为{{1} }。 (更多内容见下文。)

如果你想尝试阅读undefined一个错误,那么是的,实现一个getter并抛出。

两者的例子:



name




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



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属性,对吗?"但不,它不是。该对象具有该属性,它只是没有getter。

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



name




答案 1 :(得分:0)

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