亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么使用 getters/setters 的 Es6 類中的 Memoization 不起作用?

為什么使用 getters/setters 的 Es6 類中的 Memoization 不起作用?

HUX布斯 2023-04-14 16:27:20
我在 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);#output:未捕獲的 TypeError:設置 getter-only 屬性“name”我嘗試使用普通的 javascript 對象字面量實現相同的代碼,并且效果很好:'use strict';    const x1 = {        get name(){            //memozation            delete this.name;            return this.name = "Ahmad";        }    }    console.log(x1.name); //#output: Ahmad但在我發布這個問題之前,您可能想知道我是否嘗試過使用 setter,事實上,是的,這實際上是 MDN HERE 上提到的內容,但問題是,即使在使用 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);#output:未捕獲錯誤:未定義請注意:我正在使用嚴格模式,并且正在 Mozilla firefox 上調試我的代碼。我該如何解決這個問題?這是什么原因呢?
查看完整描述

1 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

問題delete obj[prop]是只有prop直接在. _ obj如果屬性在內部原型上,它不會刪除該屬性。再舉個例子:


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

delete obj.prop;

console.log(obj);

在您的情況下,name是原型上的一個屬性:

class obj {
   get name(){

結果name僅存在于 上obj.prototype,但不直接存在于o1實例上。

Object.defineProperty修復它的一種方法是在 getter 內部使用,將屬性直接放在實例上,以便this.name對該實例的進一步引用直接在實例上引用該屬性,而單獨使用 getter:

'use strict';


class obj {

    get name(){

        console.log('getter invoked');

        Object.defineProperty(this, 'name', { value: "Ahmad" });

        return this.name;

    }

}

const o1 = new obj();

console.log(o1.name);

console.log(o1.name);


或者,也可以使用二傳手:


'use strict';


class obj {

    defineName(value) {

        Object.defineProperty(this, 'name', { value, writable: true });

        return this.name;

    }

    get name(){

        console.log('getter invoked');

        return this.defineName("Ahmad");

    }

    set name(value) {

        console.log('setter invoked');

        return this.defineName(value);

    }

}

const o1 = new obj();

o1.name = 'foo';

console.log(o1.name);

console.log(o1.name);


查看完整回答
反對 回復 2023-04-14
  • 1 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號