繁体   English   中英

禁用ES6类中的吸气剂?

[英]Disabling a getter in an ES6 class?

class Person {
   constructor(){}

   set name(){

   }

   // delete get name() {} 
}

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

如果你有,你到过那里将它定义你的类,有没有消气的name ; 尝试从Person实例的name中读取name将产生undefined (好像根本没有为该实例定义name )。 这是由规范中的OrdinaryGet抽象操作定义的,该操作表示如果某个属性是访问器属性,但其get操作undefined ,则获取该属性的结果将是undefined (有关此内容,请参见下文。)

如果您想使读取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 

现在您可能在想:“这就像对象没有name属性,对吗?” 但是,不是。 对象具有属性,只是没有吸气剂。

如果它的行为好像没有该属性,则JavaScript引擎会查看原型以找到它,并且我们可以从上面的spec链接和此示例中看出它没有:

 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 

我会在吸气剂中throw一个异常,以避免意外的不正确使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM