上一篇文章讲到了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. poj 2486 Apple Tree (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: poj-2486 题意 给一个n个节点的树,节点编号为1~n, 根节点为1, 每个节点有一个权值.    从 ...

  2. java.io.IOException: Input/output error

    java.io.FileOutputStream.close0(Native Method)at java.io.FileOutputStream.close(FileOutputStream.jav ...

  3. flume spooldir bug修复

    BUG:在往目录中copy大文件时,没有复制完,flume就开始读-->导致报错 在代码中体现为:org.apache.flume.client.avro.ReliableSpoolingFil ...

  4. spring启动方式

    spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.看一下ContextLoaderListe ...

  5. git的color configura

    git color的配置 Git多颜色输出 Git默认的输出是单一颜色的,不仅不够美观,也不容易阅读.实际上,Git本身就支持用多种颜色来显示其输出的信息,只需在命令行中运行以下命令来修改git的设置 ...

  6. JavaWeb get请求乱码处理

      乱码终极解决方案 Author:Marydon 一.安装好eclipse/myeclipse后,先将开发环境改成UTF-8; 更改工作空间编码方式 window-->preferences- ...

  7. ActiveMq C#客户端 消息队列的使用(存和取)

    1.准备工具 VS2013Apache.NMS.ActiveMQ-1.7.2-bin.zipapache-activemq-5.14.0-bin.zip 2.开始项目 VS2013新建一个C#控制台应 ...

  8. 实践:由0到1-无线大数据UX团队的成长

    背景 大数据产品的在项目成立之初,采用的是模仿原有网优工具的方式做UI设计,由BA主导画草图.手绘线框图.excel制作,更有直接打开参考产品做原型的方式,没有统一的设计和规范可言.随着团队逐渐增多. ...

  9. PHP-Open Flash Chart学习一(swfobject知识)

    首先必须了解下swfobject的知识 在网页里面插入swf再平常不过了, 一般会想到如下代码: <object classid="clsid:D27CDB6E-AE6D-11cf-9 ...

  10. spring注解 di 和 ioc 注解

    注解: 1.注解就是为了说明java中的某一个部分的作用(Type) 2.注解都可以用于哪个部门是@Target注解起的作用 3.注解可以标注在ElementType枚举类所指定的位置上 4. @Do ...