JavaScript中的apply()

PS:写完这篇博客,总感觉太啰嗦,所以,重新写了一篇对于call()方法的总结,尽量言简意赅。

apply()方法可以直接被调用,那么它一定是继承自某个原型的方法。查了一下,方法的是继承自Function.prototype.apply(thisObj, [argArray]);

简单一点的模型就是这样:

Func.apply(thisObj, arr );

定义:

用thisObj去代替Func(调用函数)的上下文对象,传入参数arr,并执行。

调用的函数:

这个最原始的方法,来自于Function.prototype这个原型,所以,只能用function对象调用它。

参数:

第一个参数是一个Object对象,第二个参数是一个数组或者类数组。当然,你也可以不传参数,第一个参数有默认值(全局对象),第二个参数默认值,在需要的情况下,它会以包含undefined的数组补充(你真要是这么皮,哭的迟早是你自己)。

然而一切的分歧,出现在Func这个函数对象上,Func函数对象大概能分两类。

1.构造函数

    function Person(name, age){
        this.name = name;
        this.age  = age;
        this.add = function(a,b){
            return a + b;
        };
    }
    function Man(){
    }
    var person = new Person();
    var man = new Man();
    var arr = ["pi",23 ];
    Person.apply(man,arr);			        //调用函数必须是Function函数对象,不能用person
    alert(man.name);			            //pi

    //Person.apply(man,arr)等同于执行了以下代码
    Person =function Person(name,age){	    //调用构造函数
        man.name = name;		            //上下文的this被apply()第一个参数manman.age = age;
        man.add = function(a, b){		    //这个过程相当于为man添加了两个属性(实现了继承)
            return a + b;                   //并赋值(通过传入的参数赋值)
        }			        
    }(arr[0], arr[1]);			            //不要忘记传参并执行

    //然而,这只是实现了单独一个man对象的继承,如果每个new Man()都继承,只需要改下Man的构造函数
    function Man(name,age) {
        var list = [name, age];
        Person.apply(this, list);	//这里最好用call,传参一般都是单个的
    }

这里的Man继承了Person的所有属性和方法。


2.非构造函数

并不是所有的function都是构造函数,比如上面例子中的person.add,其也是个function函数,但怎么看都不是构造函数

    function Cat(){
        this.sound = "喵";
        this.noise = function () {
            alert(this.sound);
        }
    }
    function Dog(){
        this.sound = "汪";
    }
    var cat = new Cat();
    var dog = new Dog();
    //你想让你的狗叫一下,但是它不会,没关系,我们可以借下猫叫
    cat.noise.apply(dog);
    //检查一下,noise是不是dog的属性
    console.log(dog.hasOwnProperty("noise"));  //false(noise并不是dog的实例属性)
    //相当于执行了这个代码
    cat.noise = function noise() {
        alert(dog.sound);        			   //只是将this对象替换为dog对象
    }();                         			   //别忘记立马执行

这里相当于借用了一次Cat的noise()方法,用完之后,立马还了,dog并不会获得该方法。


总结一下,apply()方法的调用的理解大概就是这样

A.apply(b, arr);
// 单独函数名A为一个指针
//1.调出A所指代的函数
A = function(arg){
//2.将函数内部的this全部用b对象代替
//执行内部代码
}(arr);  //3.传入参数并立即执行,这里的arr只是表达传参,并不是说直接将数组传入,具体参照A函数的形参个数


apply()的使用可以是这样

//如果你想让对象b继承A的所有属性和方法,那就
A.apply(b, arr);

//如果你只想让对象b借用下A的某个方法,那就
A.method.apply(b, arr);

//如果你想让B的所有实例继承A的所有属性和方法,那就
function B(){
        A.apply(this, arr);
}

还有一个比较常见的用法

var arr = [23, 5, 6, 22];
var max = Math.max.apply(null, arr);//Math.max(num1,num2...)的参数不是数组,要传参,使用apply()刚刚好
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值