第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么使用 getters/setters 的 Es6 類(lèi)中的 Memoization 不起作用?

為什么使用 getters/setters 的 Es6 類(lèi)中的 Memoization 不起作用?

HUX布斯 2023-04-14 16:27:20
我在 Es6 類(lèi)中遇到了一個(gè)關(guān)于 getter 和 setter 的奇怪問(wèn)題。我想在 getter 屬性上應(yīng)用 memoization 的概念,一切似乎都很完美,但不是在嚴(yán)格模式下。'use strict';class obj {    get name(){        //memozation        delete this.name;        return this.name = "Ahmad";    }}const o1 = new obj();console.log(o1.name);#output:未捕獲的 TypeError:設(shè)置 getter-only 屬性“name”我嘗試使用普通的 javascript 對(duì)象字面量實(shí)現(xiàn)相同的代碼,并且效果很好:'use strict';    const x1 = {        get name(){            //memozation            delete this.name;            return this.name = "Ahmad";        }    }    console.log(x1.name); //#output: Ahmad但在我發(fā)布這個(gè)問(wèn)題之前,您可能想知道我是否嘗試過(guò)使用 setter,事實(shí)上,是的,這實(shí)際上是 MDN HERE 上提到的內(nèi)容,但問(wèn)題是,即使在使用 setter 之后,我也會(huì)看到另一個(gè)奇怪的問(wèn)題:這是帶有 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:未捕獲錯(cuò)誤:未定義請(qǐng)注意:我正在使用嚴(yán)格模式,并且正在 Mozilla firefox 上調(diào)試我的代碼。我該如何解決這個(gè)問(wèn)題?這是什么原因呢?
查看完整描述

1 回答

?
森林海

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊

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


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

delete obj.prop;

console.log(obj);

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

class obj {
   get name(){

結(jié)果name僅存在于 上obj.prototype,但不直接存在于o1實(shí)例上。

Object.defineProperty修復(fù)它的一種方法是在 getter 內(nèi)部使用,將屬性直接放在實(shí)例上,以便this.name對(duì)該實(shí)例的進(jìn)一步引用直接在實(shí)例上引用該屬性,而單獨(dú)使用 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);


查看完整回答
反對(duì) 回復(fù) 2023-04-14
  • 1 回答
  • 0 關(guān)注
  • 144 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)