js-apply
function sub(a, b) { return a - b; }
var a1 = sub.apply(add, [4, 2]);
var a2= add.apply(sub, [4, 2]);
var a1 = sub.call(add, 4, 2);
var a2= add.call(sub, 4, 2);
输出:a1=2 a2=6
function fun1() { this.a = 123; this.add = function () { return this.a } } function fun2() { this.a = 456; } var f1=new fun1() var f2=new fun2() var a = f1.add.call(f2); // a输出的是456
function fun1() { this.add = function () { return this.a } } function fun2() { this.sub = function () { return this.a-this.b } } function fun3() { this.a = 10; this.b = 2; fun1.call(this); fun2.call(this); } var f3 = new fun3() alert(f3.add());//fun3继承fun1的add方法 alert(f3.sub());//fun3继承fun2的sub方法
实例:
apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.
Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args-->arguments)
call:和apply的意思一样,只不过是参数列表不一样.
Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表01.<script type="text/javascript"> 02. /*定义一个人类*/ 03. function Person(name,age) 04. { 05. this.name=name; 06. this.age=age; 07. } 08. /*定义一个学生类*/ 09. function Student(name,age,grade) 10. { 11. Person.apply(this,arguments); 12. this.grade=grade; 13. } 14. //创建一个学生类 15. var student=new Student("zhangsan",21,"一年级"); 16. //测试 17. alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade); 18. //大家可以看到测试结果name:zhangsan age:21 grade:一年级 19. //学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处. 20.</script>分析: Person.apply(this,arguments);
this:在创建对象在这个时候代表的是student
arguments:是一个数组,也就是[“zhangsan”,”21”,”一年级”];
也就是通俗一点讲就是:用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面
2. call示例
在Studen函数里面可以将apply中修改成如下:
Person.call(this,name,age);
这样就ok了
3、Math.max(1,2);//js本身只能传递参数
apply会将一个数组装换为一个参数接一个参数的传递给方法
所以 Math.max.apply(null,[1,3,2])
这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法
4、Array.prototype.push 可以实现两个数组合并
push只能传递一个参数push(param1,param,…paramN)
var arr1=new Array("1","2","3"); var arr2=new Array("4","5","6"); Array.prototype.push.apply(arr1,arr2);
Array.prototype.uniqus = function () { var res = []; var json = {}; for (var i = 0; i < this.length; i++) {//this表示调用uniqus的对象 if (!json[this[i]]) { res.push(this[i]); json[this[i]] = 1;//1默认为true,0默认为false } } return res; } var arr = [112, 112, 34, '你好', 112, 112, 34, '你好', 'str', 'str1']; console.log(arr.uniqus());

浙公网安备 33010602011771号