JS 重寫alert,使之能輸出多個引數

2022-03-24 13:46:53 字數 3228 閱讀 9118

windows._alert = windows.alert;

windows.alert = function();

alert(,,,,,,,,,,);

我們知道,array.prototype.slice.call(arguments)能將具有length屬性的物件轉成陣列,除了ie下的節點集合(因為ie下的dom物件是以com物件的形式實現的,js物件與com物件不能進行轉換)

如:

1 var a=;

2 array.prototype.slice.call(a);//["first", "second"]

3 4 var a=;

5 array.prototype.slice.call(a);//[undefined, undefined]

可能剛開始學習js的童鞋並不是很能理解這句為什麼能實現這樣的功能。比如我就是乙個,所以,來**一下。

首先,slice有兩個用法,乙個是string.slice,乙個是array.slice,第乙個返回的是字串,第二個返回的是陣列,這裡我們看第2個。

array.prototype.slice.call(arguments)能夠將arguments轉成陣列,那麼就是arguments.toarray().slice();到這裡,是不是就可以說array.prototype.slice.call(arguments)的過程就是先將傳入進來的第乙個引數轉為陣列,再呼叫slice?

再看call的用法,如下例子

1 var a = function()

6 a.call('littledu');

可以看出,call了後,就把當前函式推入所傳引數的作用域中去了,不知道這樣說對不對,但反正this就指向了所傳進去的物件就肯定的了。

到這裡,基本就差不多了,我們可以大膽猜一下slice的內部實現,如下

1 array.prototype.slice = function(start,end)

8 returnresult;

9 }

大概就是這樣吧,理解就行,不深究。

最後,附個轉成陣列的通用函式

1 var toarray = function(s) catch(e)

9 returnarr;

10 }

11 }

在js中我們經常會看到array.prototype.slice.call(arguments,0)的寫法,當然,這個方法的作用也許大家都明白,那就是把類陣列物件轉換成乙個真正的陣列。關於這個方法,我說說自己的理解。

這裡涉及到slice()方法和call()方法,所以先簡單說說這兩個方法。

陣列和字串都有這個slice方法,這個方法的作用是擷取一段資料。它接收兩個引數,第乙個引數是要擷取的位置索引,第二引數可選,表示要擷取到的結束位置,但是不包括結束位置。在陣列中,該方法的返回值是包含擷取元素的組成的陣列,在字串中,該方法的返回值是包含擷取字串組成的字串。

該方法也可以傳入負數值,當引數為負數的時候,將引數和陣列或字串的長度相加得到的正數作為實際的引數。

如下:

[1,2,3,4,5,6].slice(2,4);

[1,2,3,4,5,6].slice(-4,-2);

返回值均為[3,4],為陣列。

'everything'.slice(2,4);

'everything'.slice(-4,-2);

返回值分別為'er'和'hi',為字串。

如果之傳入乙個引數的話,那就是輸出從開始位置到結束位置的所有元素。不再舉例。

在字串中,和slice()方法型別的還有兩個方法:

substring()和substr()方法。

其中,substring()方法表示返回從開始位置到結束位置的字串,substr()接收兩個引數,第乙個引數表示開始位置,第二個引數表示要擷取的字元個數,和前兩個方法略有不同。

當傳入方法的引數為負數時,這三種方法又略有不同。

當傳入方法的引數為負數時:

slice()像上面說的,是負數加上字串的長度得出相應的正值;

substring()方法的引數均置為零;

substr()方法的第乙個引數為負值加上字串長度得到的正值,第二個引數置為零。

鑑於這裡不是重點,在這裡就不再贅述。

array.prototype.slice.call(arguments,0)中,array.prototype.slice呼叫的是array的原型方法,對於正真的陣列是有slice()方法,但是對於像arguments或者自己定義的一些類陣列物件雖然存在length等若干屬性,但是並沒有slice()方法,所以對於這種類陣列物件就得使用原型方法來使用slice()方法,即array.prototype.slice(如果在自定義中的類陣列物件中自定義了slice()方法,那麼自然可以直接呼叫)。

所以,array.prototype.slice.call(arguments,0)的意思就可以這樣理解:對於arguments類陣列,我們呼叫array.prototype.slice原型方法,並用call()方法,將作用域限定在arguments中,這裡array.prototype就可以理解為arguments,同引數0為slice()方法的第乙個引數,即開始位置索引。通過這種方法就將arguments類陣列轉換成了真陣列。

當然,把arguments轉換為陣列也可以用遍歷,那樣**自然就會多一些,而且不夠直接。

以上只是一家之言,歡迎交流**。

重寫alert()方法

謝謝你曾經愛過我28全集 原來雨薇有個很嚴厲苛刻並急著要把她嫁出去的母親,雨薇新近才知道母親之所以對父親耿耿於懷是因為父親拋棄了氣質和容貌都很出眾的自己去和乙個女清潔工結婚,雨薇知道這是種很難化解的恨。但看到父親生活很困難,只好揹著母親偷偷幫助父親,包括幫母親憎恨的女人籌集換腎的錢。而這個時候多年不...

JS部分語法 alert 變數

1.指令碼標籤 2.alert語句。alert警告的意思,用途彈出警告狂。在頁面中,alert 好好學習js!alert 嘿嘿!text是純文字,js也是純文字語言。如果想彈出兩個警告框,那麼寫兩條語句。這個有規律可循,就是程式相同的部分,這部分就是一種規律,不能更改,就是語法。2.注釋 html中...

原生 js 模擬 alert 彈窗

複製頭部的 js 到你的 js 檔案的任何地方,呼叫chef.alert方法傳入相應的引數即可並沒有什麼功能,只是乙個提示的作用,可能樣式比 alert 的彈窗好看點,css是寫在js裡的,只要你會寫 css 就可以自行修改樣式.chef.alert 使用說明 此方法有6個引數 1,title 彈出...