资讯专栏INFORMATION COLUMN

20170625-bind方法的实现

djfml / 2569人阅读

方法1
Funtion.prototype.bind = function(context){
    var self = this;
    return function(){
        return self.apply(context, arguments);
    }
}

缺点: 没有办法在调用bind方法的时候指定额外的参数

方法2
Function.prototype.bind = function(context){
    var args = Array.prototype.slice.call(arguments, 1),
        self = this;
    return function(){
        var innerArgs = Array.prototype.slice.call(arguments);
        var finalArgs = args.concat(innerArgs);
        return self.apply(context, finalArgs);
    }
}
方法3

在JavaScript中,使用bind方法会遇到以下这种情况:

function Person(){
    this.name = "xin";
    this.age = "22";
}
var obj = { sex: "male"};
var temp = Person.bind(obj);
temp();
// 调用temp后,obj就成为了
/*{
    name: "xin",
    age: "22",
    sex: "male"
}*
var p = new temp();
// 结果为: p = { name: "xin", age: "22"}

通过上面的例子,可以看到通过new方式调用temp方法和用new方式调用Person方法的结果是一致的,那么这种情况该如何实现呢?下面的方法是《JavaScript Web Application》一书中对bind()的实现:通过设置一个中转构造函数F,使绑定后的函数与调用bind()的函数处于同一原型链上,用new操作符调用绑定后的函数,返回的对象也能正常使用instanceof,因此这是最严谨的bind()实现。

Funtion.prototype.bind = function(context){
    var args = Array.prototype.slice.call(arguments, 1),
        self = this,
        F = function(){},
        bound = function(){
            var innerArgs = Array.prototype.slice.call(arguments);
            var finalArgs = args.concat(innerArgs);
            // 当通过new方法调用时,this就是F的一个实例
            return self.apply((this instanceof F ? this: context), finalArgs);
        };
    F.prototype = self.prototype;
    bound.prototype = new F();
    return bound;
}
参考资料

Javascript中bind()方法的使用与实现

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83652.html

相关文章

  • 乐字节-Java8核心特性实战-接口默认方法

    摘要:语法中接口可以包含实现方法,需要使用修饰,此类方法称为默认方法。核心特性接口默认方法就介绍到这里了,后续小乐会继续讲述核心特性。 JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本。其中包括语言、编译器、库、工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术开发的趋势。这里主要讲解在开发中几个核心的新特性。(主要从...

    lbool 评论0 收藏0
  • 1、管家婆项目

    摘要:项目训练目标项目训练目标项目目标综合运用前面所学习的知识点熟练层层层之间的方法相互调用操作熟练操作数据库表完成增删改查了解公司项目开发的流程,充分的掌握项目需求分析设计与功能的代码实现。 01项目训练目标 * A: 项目训练目标 * a: 项目目标 * 综合运用前面所学习的知识点 * 熟练View层、Service层、Dao层之间的方法相互调用操...

    binaryTree 评论0 收藏0
  • Java设计模式-模板方法模式

    摘要:模板方法模式定义定义抽象类并且声明一些抽象基本方法供子类实现不同逻辑,同时在抽象类中定义具体方法把抽象基本方法封装起来,这就是模板方法模式。 近日,ofo小黄车宣布入驻法国巴黎,正式进入全球第20个国家,共享单车已然改变了我们的出行方式。就拿我自己来说,每当下班出地铁的第一件事,以光速锁定一辆共享单车,百米冲刺的速度抢在别人之前占领它。 而大家都是重复着同样的动作,拿出手机开锁、骑车、...

    levius 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<