在 ES6 class 中禁用 getter?
Disabling a getter in an ES6 class?
class Person {
constructor(){}
set name(){
}
// delete get name() {}
}
您可以为 属性 禁用 getter 吗?是否有意想不到的后果?我应该扔吗? Return未定义?
我会 throw
getter 中的一个例外,以避免无意的错误使用。
如果您有您在此处定义的 class,那么 是 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);
这是一个不使用 classes 的简单示例:
var obj = {
set name(value) {
}
};
console.log(obj.hasOwnProperty("name")); // true
console.log(obj.name); // undefined
现在您可能会想 "That's acting like the object doesn't have a name
property, right?" 但不,不是。对象有 属性,只是没有 getter.
如果它表现得好像没有 属性,JavaScript 引擎会查看原型来找到它,我们可以从规范中看到 link上面和这个例子中它没有:
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
class Person {
constructor(){}
set name(){
}
// delete get name() {}
}
您可以为 属性 禁用 getter 吗?是否有意想不到的后果?我应该扔吗? Return未定义?
我会 throw
getter 中的一个例外,以避免无意的错误使用。
如果您有您在此处定义的 class,那么 是 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);
这是一个不使用 classes 的简单示例:
var obj = {
set name(value) {
}
};
console.log(obj.hasOwnProperty("name")); // true
console.log(obj.name); // undefined
现在您可能会想 "That's acting like the object doesn't have a name
property, right?" 但不,不是。对象有 属性,只是没有 getter.
如果它表现得好像没有 属性,JavaScript 引擎会查看原型来找到它,我们可以从规范中看到 link上面和这个例子中它没有:
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