Javascript 为什么Es6课程中有getter/setter的备忘不起作用?

Javascript 为什么Es6课程中有getter/setter的备忘不起作用?,javascript,Javascript,我在Es6课程中遇到了一个关于getter和setter的奇怪问题。我想在getter属性上应用memoization的概念,一切似乎都很完美,但不是在严格模式下 'use strict'; class obj { get name(){ //memozation delete this.name; return this.name = "Ahmad"; } } const o1 = new obj(); co

我在Es6课程中遇到了一个关于getter和setter的奇怪问题。我想在getter属性上应用memoization的概念,一切似乎都很完美,但不是在严格模式下

'use strict';

class obj {
    get name(){
        //memozation
        delete this.name;
        return this.name = "Ahmad";
    }
}
const o1 = new obj();
console.log(o1.name);
#输出:未捕获类型错误:设置仅getter属性“name”

我曾尝试使用普通javascript对象文本实现相同的代码,效果非常好:

'use strict';
    const x1 = {
        get name(){
            //memozation
            delete this.name;
            return this.name = "Ahmad";
        }
    }
    
console.log(x1.name); //#output: Ahmad
但在我发布这个问题之前,你可能想知道我是否尝试过使用setter,事实上,是的,我尝试过,这就是MDN上提到的

但问题是,即使在使用setter之后,我仍然可以看到另一个奇怪的问题:这是setter的代码:

'use strict';

class obj {
    get name(){
        //memozation
        delete this.name;
        return this.name = "Ahmad";
    }
    set name(value){
        this.name = value;
    }
}
const o1 = new obj();
console.log(o1.name);
#输出:未捕获错误:未定义

请注意以下事项: 我使用的是严格模式,我正在Mozilla firefox上调试我的代码


我如何解决这个问题?原因是什么?

问题是
delete obj[prop]
只会“删除”直接位于
obj
上的属性
prop
。如果属性位于内部原型上,则不会删除该属性。再举一个例子:

const obj=Object.create({prop:'val'});
删除obj.prop;

控制台日志(obj)
问题是
delete obj[prop]
只会“删除”直接位于
obj
上的属性
prop
。如果属性位于内部原型上,则不会删除该属性。再举一个例子:

const obj=Object.create({prop:'val'});
删除obj.prop;

控制台日志(obj)属性“name”有一个getter函数。也不能将“name”用作简单属性。在调用
删除此.name
此.name=…
之前,必须创建一个字段
name
。getter不会自动为您创建字段,getter只是一个函数。您必须在类的顶部定义一个字段
private\u name:string
(您不希望该字段的名称与getter的名称冲突),然后在getter内部执行
删除操作。\u name
返回该字段。\u name=…
属性“name”具有getter函数。也不能将“name”用作简单属性。在调用
删除此.name
此.name=…
之前,必须创建一个字段
name
。getter不会自动为您创建字段,getter只是一个函数。您必须在类的顶部定义一个字段
private\u name:string
(您不希望字段名与getter的名称冲突),然后在getter中执行
删除操作。\u name
返回该属性。_name=…
或者您可以通过直接从原型中删除属性来修复它:delete Object.getPrototypeOf(this).name;[在getter内部]你可以这样做,但是延迟初始化对于以后的实例将不再有效,比如对于
o2
是的,这是真的,谢谢你的第二个答案,这是一个很快会在我的应用程序中出现的错误。但是如果你不介意的话,你能解释一下原因吗?原型对象在所有实例中都是共享的
o1或者您可以通过直接从原型中删除属性来修复它:delete Object.getPrototypeOf(this.name);[在getter内部]你可以这样做,但是延迟初始化对于以后的实例将不再有效,比如对于
o2
是的,这是真的,谢谢你的第二个答案,这是一个很快会在我的应用程序中出现的错误。但是如果你不介意的话,你能解释一下原因吗?原型对象在所有实例中都是共享的<代码>o1