通过三个apply() 例子了解apply()

一,更改this指向

 

代码:

    var name = 'window'; //默认规划到全局作用域 window 中,等于 window.name
    var obj = {
        name : 'obj'
    };
    function getName() {
        return this.name;
    }
    console.log(getName()); //这里this指向全局
    console.log(getName.apply(obj)); //这里指向 obj
    console.log(getName.call(obj)); //这里指向 obj

直接调用函数对象getName,由于没有name属性,所以找全局作用域中的name,this指向了window对象;
将getName函数在obj对象上调用,函数体内的this也就指向了obj对象; (这里call的用法和apply一样)

控制台:

二:方法的继承

代码:

 /**
     * apply 可用于方法的继承
     */

    function A(age) {
        this.age = age;  //这里this的指向会变成B()
    }

    function B(name, age) {
        A.apply(this, [age]);
        this.name = name;
        /**
         * call不需要用数组
         *
         * A.call(this, age);
         * this.name = name;
         *
         */
    }
    console.log(new B('张三',5000));

这里B方法继承了A方法中的 this.age = age ;

这个地方可以用每个函数体内都会有的 Arguments对象的实例arguments优化下:

 /**
     * apply 可用于方法的继承
     */

    function A(name,age) {
        this.age = age;  //这里this的指向会变成B()
    }

    function B(name, age) {
        A.apply(this,arguments);
        this.name = name;
    }
    console.log(new B('张三',5000));

控制台:

三,多重继承

代码:

 /**
     * 多重继承
     */
    function ClassA() {
        this.add = function (a, b) {
            return a + b;
        }
    }
    function ClassB() {
        this.sub = function (a,b) {
            return a - b;
        }
    }
    function ClassC() {
        ClassA.apply(this);
        ClassB.apply(this);
        /**
         * 用call也一样
         *
         * ClassA.call(this);
         * ClassB.call(this);
         *
         */
    }
    var classC = new ClassC();

    console.log(classC.add(3,1));
    console.log(classC.sub(3,1));

ClassC 继承了ClassA的add方法,ClassB 的sub方法;

控制台:

 

大家可以留言探讨。谢谢;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值