`
dtr1988
  • 浏览: 42846 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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([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的第二个参数传入
分享到:
评论
1 楼 zhyy22145 2012-11-02  
学习

相关推荐

    arguments:永远不要写“Array.prototype.slice.call(arguments);” 以后再!

    永远不要写Array.prototype.slice.call(arguments); 以后再! 这是基于但使用Object.defineProperty(arguments.constructor.prototype, [functionName], {enumerable: false, configurable: true, value: [function...

    浅谈javascript的Array.prototype.slice.call

    在js中我们经常会看到Array.prototype.slice.call(arguments,0)的写法,当然,这个方法的作用也许大家都明白,那就是把类数组对象转换成一个真正的数组。关于这个方法,我说说自己的理解。 这里涉及到slice()方法和...

    Array.prototype.slice.apply的使用方法

    arguments在JavaScript语法中是函数特有的一个对象属性(Arguments对象),用来引用调用该函数时传递的实际参数。

    javascript Array.prototype.slice的使用示例

    经常的,可以看到Array.prototype.slice(arguments, 0); 这个写法可以用于function() {} 内,这样可以将函数的参数列表转换成一个真正的数组。请看一个例子: 代码如下:var slice = Array.prototype.slice;var ...

    深入探密Javascript数组方法

    在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法。数组是继承自Object的原型,... var nodesArr = Array.prototype.slice.call(document.forms);  var argsArr = Array.pro

    js利用prototype调用Array的slice方法示例

    代码如下: [removed] function fn(name){ if(typeof name === “string”){ var args = Array.prototype.slice.call( arguments, 1 ); for(var i=0;i&lt;args.length;i++){ alert&#40;args[i]&#41;;//结果: 111 222 ...

    javascript 伪数组实现方法

    这篇文章来回答javascript通用循环遍历方法forEach中最后提到的关于伪数组的... 我们可以通过Array.prototype.slice.call(fakeArray)将伪数组转变为真正的Array对象。 来看个示例: 代码如下: var fakeArray01 = {0:’a

    Advanced-JavaScript:基于John Resig网站上有关Advanced JavaScript的文档

    高级JavaScript 本文档基于John Resig的高级JavaScript网站。 如果这些概念对您而言似乎很复杂,那么我建议您使用,同时也强烈建议您使用。 如果您认为自己了解大多数这些概念,则... call ( arguments ) , object =

    深入解析JavaScript中的arguments对象

    arguments定义 所有的函数都有一个自己的arguments对象,用来储存它实际接受到的参数,...var args = Array.prototype.slice.call(arguments); 类数组 1. 判断ARGUMENTS是不是数组 alert(arguments instanceof Arra

    JavaScript对象链式操作代码(jquery)

    虽然现在慢慢减少了对jQuery的使用(项目上还是用,效率高点。平时基本不用了),希望从而减少对jQuery的依赖度。 但是这链式操作的方式实在吸引人(貌似现在... //var args = Array.prototype.slice.call(arguments,0

    JavaScript 对象链式操作测试代码

    虽然现在慢慢减少了对jQuery的使用(项目上还是用,效率高点。平时基本不用了),希望从而减少对jQuery的依赖度。 但是这链式操作的方式实在吸引人(貌似现在... //var args = Array.prototype.slice.call(arguments,0

    hls.min.js

    default:s=Array.prototype.slice.call(arguments,1),r.apply(this,s)}else if(n(r))for(s=Array.prototype.slice.call(arguments,1),u=r.slice(),a=u.length,l=0;l;l++)u[l].apply(this,s);return!0},r.prototype....

    利用javascript中的call实现继承

    昨天阿丹传了一个javascript中的重载例子给我,感觉不错.... window.setTimeout = function(fRef, mDelay) { if(typeof fRef == ‘function’){ var argu = Array.prototype.slice.call(arguments,2); va

    js prototype深入理解及应用实例分析

    本文实例讲述了js prototype深入理解及应用。分享给大家供大家参考,具体... var args = Array.prototype.slice.call(arguments, 1); return args; } 咦???看着上面这行代码,你是不是对prototype只是属于函数产生

    onnex:RPC 和发布订阅

    昂尼克斯rpc 和 subpub安装 $ ... call ( arguments ) . pop ( ) ; cb ( null , a * b ) ;} ) ;onnexA . publish ( "time tick" ) ;setInterval ( function ( ) { onnexA . publish ( "time tick" , new Date ( ) . g

    关于JS中setTimeout()无法调用带参函数问题的解决方法

    本文实例分析了JS中setTimeout()无法调用带参函数问题的解决方法。分享给大家供大家参考,具体如下: ... var argu = Array.prototype.slice.call(arguments, 2); var f = function(){ fRef.apply(null, arg

    将函数的实际参数转换成数组的方法

    值得庆幸的是,我们可以通过数组的 slice 方法将 arguments 对象转换成真正的数组: var args = Array.prototype.slice.call(arguments);对于slice 方法,ECMAScript 262 中 15.4.4.10 Array.prototype.slice (start...

    nim:用于检查节点库对象、函数实现和列表属性的命令行工具——带有语法高亮显示

    call ( arguments , 0 ) ; return exports . normalize ( paths . filter ( function ( p , index ) { if ( typeof p !== 'string' ) { throw new TypeError ( 'Arguments to path.join must be strings' ) ;

    JavaScript常用脚本汇总(二)

    对于 arguments,可以使用 Array.prototype.slice.call(arguments); 来达到转换的目的,但对于 NodeList 则不行了,其在 IE8 及以下将会报错,只能说其 JS 引擎有所限制。 因此,如果需要把 NodeList 转换为真正的...

    pascaljs:js中的Pascal解析器

    帕斯卡 js中的Pascal解析器。 我们的目标是能够运行90年代依赖于asm的简单Turbo Pascal演示,但否则会非常简单。 生成的js输出非常明智... call ( arguments ) ; console . log ( args . join ( '' ) ) ; }var x = nul

Global site tag (gtag.js) - Google Analytics