class Person {
constructor(){}
set name(){
}
// delete get name() {}
}
您可以禁用属性的吸气剂吗?会有意想不到的后果吗?我应该扔吗?返回未定义?
class Person {
constructor(){}
set name(){
}
// delete get name() {}
}
您可以禁用属性的吸气剂吗?会有意想不到的后果吗?我应该扔吗?返回未定义?
如果你有你在那里定义的类,则没有 getter name
; 试图从will yieldname
的实例中读取(好像根本没有为实例定义)。这是由规范中的抽象操作定义的,它说如果一个属性是访问器属性但它的操作是,那么获取该属性的结果是。(更多内容如下。)Person
undefined
name
OrdinaryGet
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
属性一样,对吧?” 但不,不是。该对象具有属性,只是没有吸气剂。
如果它表现得好像它没有该属性,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
我会throw
在 getter 中有一个例外,以避免无意的不正确使用。