JS 有趣的應用 : Array.prototype.slice.call(arguments,0)
1。Array.prototype:就是Array的原型,很多時候理解這個原型有點不清不楚的
其實,有點像.NET裡的反射
一個類凡是通過prototype加的屬性,方法,都可以在這個類的物件裡找到 物件.
有時候我們也直接在某一物件新增屬性方法,那麼只能這個物件裡找到,重新建立的物件是沒有
剛剛在上一物件裡新增的屬性方法的
內建的型別可以通過prototype找到內建的屬性方法
Array.prototype.slice這句就是訪問Array的內建方法
因為Array是類名,而不是物件名,所以不能直接用Array.slice
2。接下來說slice方法,這個簡單
返回一個數組的一段。arrayObj
3。call方法
call([[,arg1[, arg2[, [,.argN]]]]])
呼叫一個物件的一個方法,以另一個物件替換當前物件
- thisObj
- 可選項。將被用作當前物件的物件。
- arg1, arg2, , argN
- 可選項。將被傳遞方法引數序列。
-
說明
call 方法可以用來代替另一個物件呼叫一個方法。call 方法可將一個函式的物件上下文從初始的上下文改變為由 thisObj 指定的新物件。
如果沒有提供 thisObj 引數,那麼 Global 物件被用作 thisObj。
-
這東西JS文件裡我沒找到怎麼呼叫這個方法,功能是 呼叫一個物件的一個方法
-
查過資料才知道,Array.prototype.slice.call 是這麼呼叫,只要 typesof fn ==="function" 的 fn型別都有 call 方法
- 偽組數元素
- call 方法以另一個物件替換當前物件
- thisObj 可選項。將被用作當前物件的物件。
- 這就是說:Array.prototype.slice.call(arguments,0) 這句裡,就是把 arguments 當做當前物件
- 也就是說 要呼叫的是 arguments 的slice 方法,後面的 引數 0 也就成了 slice 的第一個引數slice(0)就是獲取所有
為什麼要這麼呼叫 arguments 的slice 方法呢?就是因為 arguments 不是真的組數,typeof arguments==="Object" 而不是 "Array"
它沒有slice這個方法,通過這麼Array.prototype.slice.call呼叫,JS的內部機制應該是 把arguments物件轉化為Array
因為Array.prototype.slice.call呼叫後,返回的是一個組數
經典例子:
<script
type= "text/javascript" > //<![CDATA[ |
function classA()
{ |
this .name= 'bluedestiny' ; |
this .show
= function ()
{ |
alert( this .name); |
} |
} |
function classB()
{ |
this .name
= 'never-online' ; |
} |
var objA
= new classA(); |
var objB
= new classB(); |
objA.show.call(objB); |