js实现bind方法

var obj = {name: 'xiaoming'}

Function.prototype.mybind = function(oThis) {

    if (typeof this !== 'function') {

        // closest thing possible to the ECMAScript 5

        // internal IsCallable function

        throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');

    }

    var aArgs = Array.prototype.slice.call(arguments, 1),

    fToBind = this,

    fNOP = function() {},

    fBound = function() {

        // this instanceof fBound === true时,说明返回的fBound被当做new的构造函数调用

        return fToBind.apply(this instanceof fBound ? this : oThis,

        // 获取调用时(fBound)的传参.bind 返回的函数入参往往是这么传递的         aArgs.concat(Array.prototype.slice.call(arguments)));

    };

     // 维护原型关系

    if (this.prototype) {

        // Function.prototype doesn't have a prototype property

        fNOP.prototype = this.prototype;

    }

    // 下行的代码使fBound.prototype是fNOP的实例,因此

    // 返回的fBound若作为new的构造函数,new生成的新对象作为this传入fBound,新对象的__proto__就是fNOP的实例     fBound.prototype = new fNOP();

    return fBound;

}

function showName(pre, end) {

    console.log(pre + this.name + ',' + end);

}

var bar = showName.mybind(obj, '姓名:', '结束');

bar();

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容