1. 程式人生 > >JS 有趣的應用 : Array.prototype.slice.call(arguments,0)

JS 有趣的應用 : Array.prototype.slice.call(arguments,0)

1。Array.prototype:就是Array的原型,很多時候理解這個原型有點不清不楚的

其實,有點像.NET裡的反射

一個類凡是通過prototype加的屬性,方法,都可以在這個類的物件裡找到 物件.

有時候我們也直接在某一物件新增屬性方法,那麼只能這個物件裡找到,重新建立的物件是沒有

剛剛在上一物件裡新增的屬性方法的

內建的型別可以通過prototype找到內建的屬性方法

Array.prototype.slice這句就是訪問Array的內建方法

因為Array是類名,而不是物件名,所以不能直接用Array.slice

2。接下來說slice方法,這個簡單

返回一個數組的一段。arrayObj

.slice(start, [end]) 引數開始索引和結束索引,結束索引可以省略

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);