博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20170625-bind方法的实现
阅读量:6923 次
发布时间:2019-06-27

本文共 1472 字,大约阅读时间需要 4 分钟。

方法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;}

参考资料

转载地址:http://mbujl.baihongyu.com/

你可能感兴趣的文章
在测试中使用Docker
查看>>
Jvisualvm监控JVM和tomcat【Linux Centos】
查看>>
我的友情链接
查看>>
JAVA NIO 通道Channel的原理与获取方法
查看>>
Samba-上课内容
查看>>
框架-Tomcat BIO、NIO Connector原理
查看>>
VC开发多语言界面支持的简单方法
查看>>
常用SQL语句实例 10
查看>>
JAVA内存机制
查看>>
办公软件之excel打印时打印区域与纸张不符解决方法
查看>>
Lync 小技巧-21-通过Google浏览器加入微软Lync 2013会议
查看>>
SFB 项目经验-03-共存迁移-Lync 2013-TO-SFB 2015-完成
查看>>
《企业云桌面实施》-小技巧-2017-10-29
查看>>
nodejs http 跨域返回解决办法
查看>>
C语言练习1_大数据的简单运算
查看>>
Javascript第三记--语法基础
查看>>
ubuntu使用笔记
查看>>
xshell使用密钥登录linux服务器
查看>>
学习Python第一天!(2)
查看>>
理不清的网络基础知识(00)
查看>>