數字直接調用函數:(5).fn1(2).fn2(3)實現5-2+3

原由

在網上無心間看到這麼一道題,第一次實踐,直接報錯,因此記錄下來加深記憶

過程

一看到數字能夠調用函數,最早想到的相似的場景就是 (5).toFixed(2),那麼接下來,有兩個思路了
一、重寫Number原型對象中的方法
二、在Number的原型對象中添加方法
思路一在實踐過程當中,終於在 bind方法中迷失了自我,最後放棄治療,先記下來之後再戰。
思路二,本人沒有仔細考慮,直接寫了下面一段代碼
Number.prototype.fn1 = function (item){
    const value = this.valueOf(); // value

    const result = value - item;

    return result;
};
        
Number.prototype.fn2 = function (item){
    const value = this.valueOf(); // value

    const result = value + item;

    return result;
}
        
console.log((5).fn1(2).fn2(3));
結果就是報錯: fn1未定義
打斷點,發現沒有調用 fn1,而是在 fn2定義的時候直接報錯,在控制檯打印 Number.prototype,發現 fn1在打印出的對象中, fn2卻沒有出現。
一番死腦筋的查詢資料,最終在mdn上,發現 Number.prototypeconfigurable屬性爲 false

解決

那麼問題好辦了, Number.prototype繼承於 Object.prototypeObject.prototypeconfigurable屬性值是 true。更改代碼以下
Object.prototype.fn1 = function (item){
    const value = this.valueOf(); // value

    const result = value - item;

    return (result);
    // return result; 不加()的話,後面的.會被識別爲小數點哦
};
        
Object.prototype.fn2 = function (item){
    const value = this.valueOf(); // value

    const result = value + item;

    return result;
}
        
console.log((5).fn1(2).fn2(3));
ok,問題到這裏結束,另外,隨手查了 String.prototypeBoolean.prototype,它們的 configurable屬性值也是 false

遺留問題

其實,刪除掉上述 Number.prototype.fn2,只執行 (5).fn1(2)是能夠的,爲何加一個屬性能夠,加兩個卻不行,正在研究,也但願有高人解答。
Number.prototype.fn1 = function (item){
    const value = this.valueOf(); // value

    const result = value - item;

    return (result);
};
        
console.log((5).fn1(2));
相關文章
相關標籤/搜索