借用方法和bind全面解析_第1页
借用方法和bind全面解析_第2页
借用方法和bind全面解析_第3页
借用方法和bind全面解析_第4页
借用方法和bind全面解析_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

jsjsjs中可以用call(),apply(),bind(),可以改变调用的上下文,从而轻易地借用了其他对象的方法,这样做的好处是无需继承这些对象。这也是我实际开发中总结的一些经验,给大家。(下面交互的js终端,我用的是nodejs)简单的方式用typeofvara=1,b='abc',c=true,d=null,e=undefined;typeofatypeofbtypeofctypeofdtypeofevarfn=function(){}typeoffn我们发现d是一个对象,而不是我们要的结果null。对于的数据类型function,Object对象,以及数组检测,当我们用typeof检测,除了function的类型是function外,其他的都是Objectvararr=[1,3,4]typeofarrvarobj={'a':1,'b':2}typeofobj那么为了更好的检测一个变量的类型,我们可以调用Ototype.toString(js中除了null外,其顶层原型是OtotypetoString)jscall,apply用来改变上下文执行环境,也就是我们通常看到this指针的指向)。基于这些,我们可以轻易的写一个funcitonfunctionreturnOtotype.toString.call(str).slice(8,-1);//[ObjectObject8returnOtotype.toString.call(str).slice(8,-demofunctioncheckVarType(str){returnOtotype.toString.call(str).slice(8,-1);};jsstring,number,boolean,几乎所有的数据都是对象。是一种适用于遍历和转换有序数列的对象,在它的原型上有slice,join,push,pop见的是Atype.slicefunctionmyfn(){//arguments.sort();这样会报错,因为argumentsvarargs=Atotype.slice.call(arguments)arguments}function...varargs=...a...return...vararr=myfn('a','b','abc','e');['a','abc','b','e'call,apply的其他方法filter,joinArray上的joinAtotype.join.call('abc','@');//Atotypeprototype,而Atotype顶层是Ototype。demo:indexOfdemo:将数据元素转换为小写,可以借用字符串上的小写函数toLowerCasevartoUpper=Stotype.toLowerCase;['a','b']义的(字符串的sliceStotypeStotype字面量在['b','a']call,apply象上应用比较多,我们有时候无需为字符串拓展一些新的方法,在实际的项目中,对于this函数的调用者(上下文环境),在以后的es6中会逐渐规范,有的朋友,可以读读es6相关属性和关于bindbind()方创建一个新函数,称为绑定函数。当调用这个绑定函数时,绑定函数会以创建它时传入bind()thisbindfunctionthis.nickname=name;this.distractedGreeting=function(){console.log("o,mynameis"+this.nickname);//当我们在调用函数this指向该调用函数,而不在是上下文this},}}varalice=new('Alice');//o,mynameis这个时候输出的this.nickname是undefinedthis数时候确定的,再因为setTimeout在全局环境下执行,所以this指向setTimeout的上下文:以前解决这个问题的办法通常是缓存this,例如:function(name){this.nickname=name;this.distractedGreetingfunctionvarself=this;//<--注意这一行!console.log("o,mynameis"+self.nickname);//<--还有这一行},}}varalice=new('Alice');//after500mslogs"o,mynameis这样就解决了这个问题,非常方便,因为它使得setTimeout函数中可以 但是现在有一个更好的办法!您可以使用bind。上面的例子中被更新为:function(name){this.nickname=name;this.distractedGreeting=function(){console.log("o,mynameis"+}.bind(this),500);//<--this}}varalice=new('Alice');//after500mslogs"o,mynameisbind()最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的this值。JavaScript新手经常犯的一个错误是将一个方法从对象中拿出来,然后再调用,希望方法中的this是原来的对象。(比如this.x=varmodule=x:getX:function(){returnthis.x;module.getX();//vargetX=getX9this//创建一个'this'绑定到module的函数varboundGetXgetX.bind(module);boundGetX();//81BrowserVersionsupportChrome7Firefox(Gecko)4.0InternetExplorerOperaSafari很不幸,Ftotype.bind在IE8话,可能在运行时会出现问题。bindECMA-262行。你可以部份地在开头加入以下代码,就能使它运作,让不支持的浏览器也能使用bind()功能。if(!Ftotype.bind){Ftotype.bind=function(){varmethod=this;varargs=Atotype.slice.call(arguments);varobject=args.shift();returnfunction()returnmethod.apply(object,args.concat(Atotype.slice.call(arguments))}}}/2014/01/23/understanding-javascript-function-prototype- fun.bind(thisArgarg1arg2thisnewarg1,arg2,bind(一个绑定的函数)有同样的函数体(ECMAScript5Call),当该函数(绑定函数的原函数)thisbind能被重写。绑定函数被调用时,bind()也接受预设的参数提供给原函数。一个绑定函数也能使用new操this完整的if(!Ftotype.bind){Ftotype.bind=function(){varmethod=this;varargs=Atotype.slice.call(arguments);varobject=args.shift();returnfunction()returnmethod.apply(object,args.concat(Atotype.slice.call(arguments))}}}function(name){=name;this.say=function(){console.log("mynameis}}varman=newman.say();//mynameisthisfunction_2(name){=name;var_thisthisthisthis.say=function(){console.log("mynameis}}varman_2=new_2("heige");man_2.say();//mynameis:heige//makeuserofbindtopointthisthisfunction_3(name){=name;var_this=this;this.say=fun

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论