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

 

 

posted @ 2015-08-20 17:36  wjl910  阅读(130)  评论(0)    收藏  举报