2013-02-11 27 views
0

我剛剛閱讀了關於覆蓋瀏覽器全局變量(例如Array)的John Resig article,但是當我在瀏覽器中嘗試該示例時,什麼都沒有發生。在現代瀏覽器中覆蓋全局

下面的代碼:

var sec = {}; 
function Array() { 
    alert(1); 
    sec = this; 
}; 

,當我在我的瀏覽器的控制檯運行["zdxc", "sd", 1111, 11.1],沒有什麼happend。數組聲明並且不顯示警報。

這是一個在現代瀏覽器中修復的錯誤,還是在某些版本的瀏覽器中仍然有效?

+0

它只適用於'var a = new Array();' – nozzleman 2013-02-11 08:39:24

回答

2

這是因爲你重寫了數組構造函數,它使得調用new Array();返回的實際對象爲Array

所以調用

var arr = ["zdxc", "sd", 1111, 11.1]; 

使得arr beeing本地Array

調用

var arr_override = new Array(); 

使得arr_override beeing之前,因此執行你的alert語句來宣告你的類型的Object。覆蓋構造函數類型的「擦除」Array - 初始化從標識符替換您的構造函數。它不是一個實際的Array

根據the answer to this question陣列 - 文字([])不beeing影響,因爲在所有的瀏覽器市長關於2008年這種行爲..

編輯:

了一下週圍嘗試之後,在沒有似乎有可能修改[] -notation的行爲,並且不推薦修改本地對象(特別是它們的構造函數)。

它是如何以往可以延長原型,並修改下面

var arr = []; 
arr.push('2323'); 
alert(arr); 

Array.prototype.push = function() { alert('trololololo'); } 
arr.push(123); 

希望這有助於像例如現有的屬性/方法。乾杯!

+0

感謝您的回覆,那麼是不是意味着我們不能再修改Array-literal('[]')了? – 2013-02-11 10:03:39

+0

至少我不知道這個肩膀是如何工作的;;) – nozzleman 2013-02-11 10:22:45

+1

看看編輯 – nozzleman 2013-02-12 07:54:28