是这样子的,Arguments获取func函数实参列表,生成一个对象传递给call()函数,call函数又把Arguments生成的对象传递给Array.prototype这个空数组,把第二个参数···1···传递给slice函数,然后,call就让引用它的函数slice执行slice(1),所以slice就从1下标开始获取数组的元素了,而这个数组的元素其实就是Arguments的元素,因此,这个函数func的作用就是获取下标为1开始的所有实参。不相信,你自己可以执行一下上面的函数。
下面讲讲prototype的应用:
应用1:
给原型对象增加函数,就是让对象拥有公用的函数。
例子:我给数组原型对象增加一个打乱数组方法:
//给数组原型增加一个打乱数组的函数 Array.prototype.shuffle=function(){ var value = this.valueOf(),len = this.length,temp,key; while(len--){ //随机生成数组的下标 key = Math.floor(Math.random()*len); //temp为中间交换变量 temp = value[key]; value[key] = value[len]; value[len] = temp; } return value; } var arr1 = [0,1,2,3,4,5,6,7,8,9]; var arr2 = ['a','b','c','d','e','f']; alert(JSON.stringify(arr1.shuffle())); alert(JSON.stringify(arr2.shuffle()));
你可以尝试着再增加一个数组arr3看看它能不能调用shuffle函数,因为我这里是给Array的原型对象增加的函数,所以在这个脚本内,所有数组都拥有shuffle这个函数。
应用2:
给原型对象增加属性,也就是给对象增加公用的属性
例子:
function fun(){ } fun.prototype.name = '小东'; fun.prototype.arr = [1,2,3,4];//这里的属性可以是数组,也可以是对象 var ob1 = new fun(); var ob2 = new fun(); alert(JSON.stringify(ob1.name)); alert(JSON.stringify(ob2.arr));
应用3:
实现原型继承;
function P1(){ } function P2(){ } //原型对象增加属性和方法 P2.prototype.name = 'P2"s name'; P2.prototype.get=function(value){ return value; } //实例化P2构造函数的一个对象 var obp2 = new P2();//这个对象应该包含所有原型对象的属性和方法 //给P1的原型对象赋值一个对象,相当于P1继承了obp2的所有属性和方法 P1.prototype = obp2;//这个式子,简单来讲就类似于a = b, b赋值给a这个总该明白吧? //调用P1从obp2继承过来的get函数 alert(P1.prototype.get('out"s name')); //展示P1从obp2继承过来的name属性 alert(P1.prototype.name); //用构造函数P1实例化一个obp1对象 var obp1 = new P1(); //P1的原型对象prototype既然已经继承了obp2的所有属性和函数,那么依据P1所实例化出来的对象也都有obp2的属性和函数了 alert(obp1.get('obp1"s name'));
关于prototype就讲到这里,假如本文有什么错误,还望各位看官指出,我好纠正。
特别指出:
Array.prototype是一个数组
String.prototype是一个字符串
Object.prototype是一个对象
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》