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

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

使用 Function 構造函數重寫 Object.prototype 方法時出現范圍錯誤

使用 Function 構造函數重寫 Object.prototype 方法時出現范圍錯誤

繁星淼淼 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);當我在控制臺中運行它時,我得到以下輸出:[object TestClass]好處是它不會徹底改變Object.prototype.toString工作方式,因此使用另一種類型[即不是 TestClass],事情會按預期工作,例如Object.prototype.toString.call(12)將輸出[object Number].到目前為止,這個實現沒有任何問題。但是,我有另一個實現,代碼如下:(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。但是,我不明白為什么第二個實現是遞歸的,如果第一個實現不是遞歸的?注意if(this instanceof MyClassType){return '[object MyClassType]'}:第二個實現的原因是從數組中的類名列表動態(tài)添加不同類的類型檢查代碼[即]。換句話說,我不是修改每個新類的代碼,而是將類名附加到數組中,然后自動生成條件語句。
查看完整描述

1 回答

?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

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


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


(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();

})();

或作為參數:


(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);

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

})();


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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