bind用法及简单实现原理

2019-07-14  本文已影响0人  李友胜

前言

bind和call/apply一样,都是用来改变上下文this指向,不同的是,call/apply直接使用在函数上的,而bind绑定this后返回一个函数,如下

var obj = {
        num: 1,
        add: function(a, b){
              return a + b + this.num;
        }
}
obj.add(1,2)  // 4
var test = obj.add
test(1,2) // NaN, 此时this指定全局window

test.call(obj, 1, 2) // 4
test.apply(obj, 1, 2) // 4 
test.bind(obj, 1, 2)  // 此时返回一个函数,不会立即执行
test.bind(obj, 1, 2)  // 4

bind的实现

// 1.传递一个参数context
Function.prototype.bind = function(context) {
        var _this = this;
        return function() {
            return _this.apply(context, arguments)
        }
}

// 2. 修改传递多个参数
Function.prototype.bind = function(context) {
        var _this = this;
        var args = Array.prototype.slice.call(arguments, 1)

        return function() {
            return that.apply(context, args.concat(Array.prototype.slice.call(arguments)))
        }
}

// 3.作为构造函数
Function.prototype.bind = function(context) {
    var that = this;
    var args = Array.prototype.slice.call(arguments, 1);

    var bound = function() {
       if(this instanceof bound) { // 如果是作为构造函数,那么第一个参数 context 就不需要了
            return that.apply(this, args.concat(Array.prototype.slice.call(arguments)));
       } else {
            return that.apply(context, args.concat(Array.prototype.slice.call(arguments))) 
       }
    }

    // 维护原型关系
    if(this.prototype) {
        bound.prototype = this.prototype;
    }

    return bound;
}
上一篇下一篇

猜你喜欢

热点阅读