JS內置對象的原型不能重定義?只能動態添加屬性或方法?


昨天馬上就快下班了,坐在我對面的同事突然問我一個問題,我說“愛過”,哈哈,開個玩笑。情況是這樣的,他發現JS的內置對象的原型好像不能通過字面量對象的形式進行覆蓋,

只能動態的為內置對象的原型添加屬性或方法,下面那個具體的例子說明:

var arr=[];
Array.prototype={
    push:function(){
        alert("1");
    }
};
arr.push();    //沒有任何輸出

有人可能會說了“你先定義的arr,后來又修改了Array.prototype,這時Array.prototype.__proto__===Object.prototype,而arr.__proto__===[],所以arr找不到push方法”;那好這次我們把arr的定義放到Array.prototype的后面:

Array.prototype={
    push:function(){
        alert("1");
    }
};
var arr=[];
arr.push();    //輸出0,因為arr是空數組,而且push沒有傳入任何參數,所以返回arr的length,即0

看到了吧,arr調用的還是數組的原push方法,而不是Array.prototype的push方法,有人可能又要說了“內置對象是可以覆蓋的,但是需要手動的為原型設置constructor,像這樣constructor:Array”,好~,既然你們說了,那我們就再來看看:

var arr=[];
Array.prototype={
    constructor:Array,
    push:function(){
        alert("1");
    }
};
arr.push();    //毛也沒輸出啊

死心了吧,嘿嘿,這是內置構造器,不是我們自定義的構造器,所以該方法是行不通的

那么只有一個結論了,那就是“JS內置對象的原型不能整體覆蓋,只能單獨地動態地為原型添加屬性或方法”,那么如何動態呢,就像這樣:

//無論arr放到那,Array.prototype.push的上面或下面都可以,push都能覆蓋Array原型的原push方法
var
arr=[];
//這就是動態 Array.prototype.push
=function(){ alert("1"); } arr.push(); //此處提示“1”,有截圖為證

 

結語:希望大家不要被我搞糊塗,如有錯誤,還請各位多多指教,在此謝過


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM