Array.prototype.slice.call(arguments,0)

来源:互联网 发布:mac safari 收藏夹 编辑:程序博客网 时间:2024/06/07 04:50
1。Array.prototype:就是Array的原型,很多时候理解这个原型有点不清不楚的 

其实,有点像.NET里的反射 

一个类凡是通过prototype加的属性,方法,都可以在这个类的对象里找到 对象. 

有时候我们也直接在某一对象添加属性方法,那么只能这个对象里找到,重新创建的对象是没有 

刚刚在上一对象里添加的属性方法的 

内置的类型可以通过prototype找到内置的属性方法 

Array.prototype.slice这句就是访问Array的内置方法 

因为Array是类名,而不是对象名,所以不能直接用Array.slice 



2。接下来说slice方法,这个简单 

返回一个数组的一段。arrayObj.slice(start, [end]) 参数开始索引和结束索引,结束索引可以省略 

3。call方法 

call([thisObj[,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); 
//]]></script> 

跟call类似的还有 apply 方法 

应用某一对象的一个方法,用另一个对象替换当前对象。 

apply([thisObj[,argArray]]) 

参数 

thisObj 
    可选项。将被用作当前对象的对象。 
argArray 
    可选项。将被传递给该函数的参数数组。 

说明 

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。 
呵呵,这么火星的功能,实在是少见啊,估计也就是JS里 

两者的区别: 对于apply和call两者在作用上是相同的,但两者在参数上有区别的。 
对于第一个参数意义都一样,但对第二个参数: 
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。 
如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3]) 

同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入
0 0