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

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

使用 Function 構(gòu)造函數(shù)重寫 Object.prototype 方法時出現(xiàn)范圍錯誤

使用 Function 構(gòu)造函數(shù)重寫 Object.prototype 方法時出現(xiàn)范圍錯誤

繁星淼淼 2023-09-21 16:59:06
我試圖重寫Object.prototype.toString以添加其他類描述的功能。這是初始代碼:(function(toString){    Object.prototype.toString = function(){        if(this instanceof TestClass)        {            return '[object TestClass]';        }        return toString.apply(this, arguments);    }})(Object.prototype.toString);function TestClass(){}var instance_obj = new TestClass();Object.prototype.toString.call(instance_obj);當(dāng)我在控制臺中運(yùn)行它時,我得到以下輸出:[object TestClass]好處是它不會徹底改變Object.prototype.toString工作方式,因此使用另一種類型[即不是 TestClass],事情會按預(yù)期工作,例如Object.prototype.toString.call(12)將輸出[object Number].到目前為止,這個實現(xiàn)沒有任何問題。但是,我有另一個實現(xiàn),代碼如下:(function(toString){    var fn_code_str = `return function(){        if(this instanceof TestClass)        {            return '[object TestClass]';        }                    return toString.apply(this, arguments);    }`;    var pre_fn = new Function(fn_code_str);    Object.prototype.toString = pre_fn();})(Object.prototype.toString);function TestClass(){}var instance_obj = new TestClass();Object.prototype.toString.call(instance_obj);這似乎是 的遞歸問題toString.apply。但是,我不明白為什么第二個實現(xiàn)是遞歸的,如果第一個實現(xiàn)不是遞歸的?注意if(this instanceof MyClassType){return '[object MyClassType]'}:第二個實現(xiàn)的原因是從數(shù)組中的類名列表動態(tài)添加不同類的類型檢查代碼[即]。換句話說,我不是修改每個新類的代碼,而是將類名附加到數(shù)組中,然后自動生成條件語句。
查看完整描述

1 回答

?
翻過高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗 獲得超3個贊

問題是toStringIIFE 的參數(shù)不在new Function代碼的范圍內(nèi)。相反,它使用全局toString== 。window.toStringObject.prototype.toString


要解決此問題,您需要在 的代碼toString中聲明變量new Function以使返回的閉包起作用。作為一個簡單的常數(shù):


(function() {

    var pre_fn = new Function(`

    const toString = Object.prototype.toString;

//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    return function(){

        if(this instanceof TestClass) {

            return '[object TestClass]';

        }

            

        return toString.apply(this, arguments);

    }`);

    Object.prototype.toString = pre_fn();

})();

或作為參數(shù):


(function() {

    var pre_fn = new Function('toString', `

//                            ^^^^^^^^^^^

    return function(){

        if(this instanceof TestClass) {

            return '[object TestClass]';

        }

            

        return toString.apply(this, arguments);

    }`);

    Object.prototype.toString = pre_fn(Object.prototype.toString);

//                                     ^^^^^^^^^^^^^^^^^^^^^^^^^

})();


查看完整回答
反對 回復(fù) 2023-09-21
  • 1 回答
  • 0 關(guān)注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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