上一篇文章讲到了javascript原生的bind方法:

http://www.cnblogs.com/liulangmao/p/3451669.html

这篇文章就在理解了原生bind方法的原理以后,自己写一个原型bind方法,来兼容ie低版本浏览器:

bind方法一共做了三件事:

1.改变方法中的上下文

2.为方法传入实参

3.返回一个改变了上下文并且调用的时候传入指定的实参的新方法

因此,我们就照着这个思路,写一个Function的原型方法:

    if(!Function.prototype.bind){
Function.prototype.bind= function(obj){
//保存调用bind的方法
var self = this;
//保存调用bind时的参数
var selfArg = Array.prototype.slice.call(arguments,1);
//当使用new方式来调用bind后的方法,需要使用bridge来继承self的原型;
var bridge = function(){};
bridge.prototype = self.prototype;
//创建新的函数
var _self = function(){
//调用新函数时,将调用新函数时传入的参数和bind时的参数合并
var newArg = selfArg.concat(Array.prototype.slice.call(arguments));
//返回执行self方法,改变指针和参数
//如果是使用new方法调用,那么this上下文就是实例化以后的实例,而不是bind时传入的obj,这个暂时想不到有什么例子需要这样调用
return self.apply(this instanceof bridge? this : obj||{} , newArg)
};
_self.prototype = new bridge();
//返回新创建的函数
return _self;
}
}

下面来看下使用bind的结果:

    var intro = function(age){
//arguments[arguments.length-1]可以用来访问事件对象
//bind方法会把执行方法时的参数放在bind时传入的参数的后面,然后一起执行,所以,事件对象作为触发事件时传入的参数,它就是最后一个参数,
//并且使用这种方式访问事件对象无需考虑兼容性问题
alert(arguments[arguments.length-1].clientX);
alert(this.name+','+this.job+','+age);
}; var jyh = {name:'jyh',job:'web-front-end'};
var introOther = intro.bind(jyh,18); if(document.addEventListener){
document.addEventListener('mousedown',introOther);
}
else{
document.attachEvent('onmousedown',introOther)
} //如果使用new方式来调用,那么this指针指向zxg实例
var zxg = new introOther();

这样就做到了在任意浏览器中使用bind方法

javascript原生bind方法ie低版本兼容详解的更多相关文章

  1. object.bind()方法的低版本兼容

    Function.prototype.bind= function(obj){ var _self = this, args = arguments; return function() { _sel ...

  2. javascript原生bind方法详解

    bind()方法,是javascript原生的函数类的一个原型方法(即Function.prototype里的方法),不支持ie低版本. 基本格式: function.bind(obj1,obj2,o ...

  3. Object.create()方法的低版本兼容问题

    Object.prototype.create=(function(){ if(Object.prototype.create){return Object.prototype.create}else ...

  4. fetch ios低版本兼容cannot clone a disturbed response

    报错信息 ios 11以下 cannot clone a disturbed response github.com/github/fetc- 问题发生场景 使用了一个或者多个三方库 三方库或者自己的 ...

  5. Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat

    extends:http://www.cnblogs.com/tianzhijiexian/p/4087917.html 本文是对API中的方法做了介绍,如果想要看如何让这些方法兼容4.x或2.x可以 ...

  6. Material Designer的低版本兼容实现(一)—— 简介 & 目录

    很长一段时间没写东西了,其实是因为最近在研究Material Designer这个东西,熬夜熬的身体也不是很好了.所以就偷懒没写东西,这回开的这个系列文章是讲如何将Material Designer在 ...

  7. react第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制)

    第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制) 课程目标 深入理解和掌握事件的冒泡及捕获机制 理解react中的合成事件的本质 在react组件中合理的使用原生事件 ...

  8. UIViewController中各方法调用顺序及功能详解

    UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...

  9. jQuery插件开发的两种方法及$.fn.extend的详解(转)

    jQuery插件开发的两种方法及$.fn.extend的详解 jQuery插件开发分为两种:1 类级别.2 对象级别,下面为大家详细介绍下   jQuery插件开发分为两种: 1 类级别 类级别你可以 ...

随机推荐

  1. 谈一谈chrome浏览器使用

    F3或Ctrl+F5: 查找本网页里面的内容,匹配到即可高亮. F6:回到地址栏 Ctrl+J:显示下载内容 Ctrl+N: 新建一个标签页 F10:选项 F11:显示全屏 F12:调试网页 大家有什 ...

  2. jQuery之前端国际化jQuery.i18n.properties[转]

    http://www.ibm.com/developerworks/cn/web/1305_hezj_jqueryi18n/ jQuery.i18n.properties是一款轻量级的jQuery国际 ...

  3. MySQL 联合索引测试2

    接上一篇文章: http://www.cnblogs.com/xiaoit/p/4430300.html 1:首先删掉上一篇建立的索引,重新建立一个. mysql> DROP INDEX idx ...

  4. 解决sqlplus: command not found

    export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product//db_1 su - root ln -s $OR ...

  5. jquery实现下拉联动

    很多项目用到这个功能,虽然写了不下5次以上了,一直没做过记录,记录一下,下次直接拷贝了,免得还得要重复写浪费时间. 先上HTML代码: 品牌: <select class="sa&qu ...

  6. shell之“>/dev/null 2>&1”

    shell之“>/dev/null 2>&1” http://ixdba.blog.51cto.com/2895551/526442 今天在自己的一个技术群中又被问道了这么一个问题 ...

  7. Android API之android.widget.Filterable

      android.widget.Filterable 定义了一种可过滤的行为.Filterable接口通常有android.widget.Adapter来实现.接口Filterable中有个抽象方法 ...

  8. [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)

    1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...

  9. 工作总结 ModelState.AddModelError("ShiYiObject", "对象不能为空!"); 小知识

    // // 摘要: // 获取包含模型状态和模型绑定验证状态的模型状态字典对象. // // 返回结果: // 模型状态字典. public ModelStateDictionary ModelSta ...

  10. oc 调用c语言方法和oc的方法调用

    //c语方的方法 void sayHello(){ printf("Hello OC"); } int main(int argc, char * argv[]) { sayHel ...