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 类级别 类级别你可以 ...
随机推荐
- 改进版高速排序(平均复杂度O(NlogN))
#include<iostream> using namespace std; #define MAXSIZE 21 typedef int SqList[MAXSIZE]; #defin ...
- Discuz的sc 和tc版本有什么区别
Discuz的sc 和tc版本有什么区别 简单的来说: sc 是tc 是繁体中文 简体中文Simplified Chinese 繁体中文traditional Chinese
- 堆叠相冊效果,兼容pc和移动端
在手机端,堆叠效果的相冊是比較常见的一种图片展示方式,每一个人的思路可能会有一些不同,实现的方法不同. 本篇博客主要是分享下我的实现方法.欢迎大家提出建议,指出我的不足,先3Q啦~ 先看一下终于的效果 ...
- SpringMVC 类内部的RequestMapping注解能否被继承?
首先注意标题,说的是类内部的注解 结论是: 不能,但是子类却可以享有父类中该注解带来的效果. 看了一下这个:http://elf8848.iteye.com/blog/1621392 自己也试了一下, ...
- Tomcat 配置加密的服务器连接器
先查询API,找到Configuration里面的Connector的HTTP中的SSL(加密连接器) SSL abbr. Security Socket Layer 加密套接字协议层 利用已生成 ...
- Start-Sleep 帮助信息
如下说明是翻译: help Start-Sleep 产生的帮助信息.译者: Edengundam(马涛) Start-Sleep 大纲使shell, 脚本, 或运行空间的活动挂起指定的时间. 语法St ...
- Linux-JAVA-JDK完整配置过程
JDK是目前很流行的开发工具包,内含jre是支撑jvm运行的组件. 01.jdk下载 http://www.oracle.com/technetwork/java/javase/downloa ...
- linux FTP配置详解
一.vsftpd说明: LINUX下实现FTP服务的软件很多,最常见的有vsftpd,Wu-ftpd和Proftp等.Red Hat Enterprise Linux中默认安装的是vsftpd. 访问 ...
- POJ 3468 A Simple Problem with Integers 【树状数组】
题目链接:id=3468">http://poj.org/problem?id=3468 题目大意:给出一组数组v[i],有两种操作,一种给出两个数a,b.要求输出v[a]到v[b]之 ...
- iOS - CFNetwork 的使用
1.CFNetwork CFNetwork 是基于 OS 层 BSDSocket 封装(纯 C),用于网络通信,早期的网络请求框架 ASIHTTPRequest 就是基于 CFNetwork 进行的封 ...