javascript原生bind方法ie低版本兼容详解
上一篇文章讲到了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低版本兼容详解的更多相关文章
- object.bind()方法的低版本兼容
Function.prototype.bind= function(obj){ var _self = this, args = arguments; return function() { _sel ...
- javascript原生bind方法详解
bind()方法,是javascript原生的函数类的一个原型方法(即Function.prototype里的方法),不支持ie低版本. 基本格式: function.bind(obj1,obj2,o ...
- Object.create()方法的低版本兼容问题
Object.prototype.create=(function(){ if(Object.prototype.create){return Object.prototype.create}else ...
- fetch ios低版本兼容cannot clone a disturbed response
报错信息 ios 11以下 cannot clone a disturbed response github.com/github/fetc- 问题发生场景 使用了一个或者多个三方库 三方库或者自己的 ...
- Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
extends:http://www.cnblogs.com/tianzhijiexian/p/4087917.html 本文是对API中的方法做了介绍,如果想要看如何让这些方法兼容4.x或2.x可以 ...
- Material Designer的低版本兼容实现(一)—— 简介 & 目录
很长一段时间没写东西了,其实是因为最近在研究Material Designer这个东西,熬夜熬的身体也不是很好了.所以就偷懒没写东西,这回开的这个系列文章是讲如何将Material Designer在 ...
- react第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制)
第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制) 课程目标 深入理解和掌握事件的冒泡及捕获机制 理解react中的合成事件的本质 在react组件中合理的使用原生事件 ...
- UIViewController中各方法调用顺序及功能详解
UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...
- jQuery插件开发的两种方法及$.fn.extend的详解(转)
jQuery插件开发的两种方法及$.fn.extend的详解 jQuery插件开发分为两种:1 类级别.2 对象级别,下面为大家详细介绍下 jQuery插件开发分为两种: 1 类级别 类级别你可以 ...
随机推荐
- javascript---对象和函数的引用、浅拷贝、深拷贝、递归
1.javascript 对象和函数的引用 <!doctype html> <html lang="en"> <head> <meta c ...
- linux下查看线程数的几种方法
1. cat /proc/${pid}/status 2.pstree -p ${pid} 3.top -p ${pid} 再按H 或者直接输入 top -bH -d 3 -p ${pid} t ...
- win10系统80端口被占用怎么办?
win10系统80端口被占用怎么办? 因为win10默认开启了IIS因此占用了80端口,可以netstat –ano 查到. 运行netstat -aon | findstr :80 ,发现pid是4 ...
- use of _track and track_visibility
Dosen't work...the followers don't recieve an email when the state is change. Here is the code in th ...
- js 自定义方法
js自定义封装方法 CreateTime--2016年10月16日15:18:18Author:Marydon 声明:该文章主要是记录了需要使用javascript实现对日常需要的方法进行封装,封 ...
- Centos 7 minimal install 后的基础配置
Centos 7 基础设置: 修改默认语言: 不再是修改 /etc/sysconfig/i18n, 而是要修改 /etc/locale.conf, 以及 /etc/yum/pluginconf.d/l ...
- 转:完成端口(Completion Port)详解
手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解 ...
- 执行存储过程报错——ora-01031:权限不足
1. 执行DDL报错 在oracle存储过程中,默认是可以直接执行DML和DQL的,但是执行CREATE这种的DDL则需要借助EXECUTE IMMEDIATE ···了,如下备份表语句 --抄表表备 ...
- innerHTML和innerText区分
示例代码:<div id="test"> <span style="color:red">test1</span> test ...
- centos部署supervisor
#!/bin/bash yum -y install python-setuptools ping pypi.python.org -c 4 >/dev/null 2>&1 eas ...