js - 改变this指向(3个方法)

1. call()方法

		 1)可直接调用函数
		2)括号里可传值,第一个值写要改变的this指向的位置,后面可以写入要传入的参数
		3)可实现继承

改变this指向

function uname(a,b) {
        console.log(this)
        console.log(a+b)
    }
    var o = {
        name: 'Herry'
    }
    uname.call(o,2,3)

在这里插入图片描述
若不改变this指向,自定义函数uname本身指向的是window,而call()方法改变了this指向,使其指向了o对象。

实现继承

// 实现继承
    function Father(uname,uage,usex) {
        this.uname = uname;
        this.uage = uage;
        this.usex = usex;
    }
    function Son(uname,uage,usex) {
        Father.call(this,uname,uage,usex)
    }
    var son = new Son('Potter',18,'男')
    console.log(son);

在这里插入图片描述

2. apply()方法

1)也是调用函数,改变this指向与call()方法同。
2)而括号内传入参数必须是数组,这是与call()方法不同之处。
3) apply的主要应用,比如可以利用apply借助于数学内置对象求最大值。Math.max()

// apply() 方法
    function u(arr) {
        console.log(this)
        console.log(arr)
    }
    var h = {
        name: 'Helen'
    }
    u.apply(h,[4])

在这里插入图片描述

// apply应用,借助于数学内置对象
    var arr1 = [2,34,45,23,12];
    var max = Math.max.apply(Math,arr1) // 为了规范,指向Math
    console.log('数组中最大值为:' + max);

3. bind()方法

1)与call(),apply()区别,不会调用原来函数,若想调用需要赋值后再调用一遍,调用函数与call()同。
2)bind()在这三个方法中用的最多,后面会给实际例子。

// bind方法
    // 与call(),apply()区别,不会调用原来函数,需要赋值后再调用一遍,调用函数与call()同
    function f(a,b) {
        console.log(this)
        console.log(a - b)
    }
    var j = {
        name: 'Kuper'
    }
    var h = f.bind(j,6,1);
    h();

在这里插入图片描述
3)如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向,此时用bind
例:我们有一个按钮,当我们点击了之后,就禁用这个按钮,3秒钟之后开启这个按钮

单个按钮

var btn = document.querySelector('button');
    btn.addEventListener('click',function () {
        this.disabled = true;  // 这个this指向的是btn这个按钮
        setTimeout(function () {
            this.disabled = false; //this本身在定时器里指向的是window,通过bind()方法改变了this指向
        }.bind(this),3000) // 这个this指向的是btn这个对象。因为这个this是在定时器外边而在btn这个对象里边
    })

在这里插入图片描述
多个按钮
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值