昨天馬上就快下班了,坐在我對面的同事突然問我一個問題,我說“愛過”,哈哈,開個玩笑。情況是這樣的,他發現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”,有截圖為證
結語:希望大家不要被我搞糊塗,如有錯誤,還請各位多多指教,在此謝過