版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章JS类,继承,闭包,回调回顾JavaScript对象事件处理JavaScript内置对象的分类JavaScriptString对象JavaScriptArray对象JavaScriptDate对象JavaScriptRegExp正则表达式对象本章内容JavaScript定义类或对象JavaScript继承JavaScript闭包JavaScript回调定义类或对象JavaScript中定义类或对象的方式:工厂方式构造函数方式原型方式混合的构造函数/原型方式……定义类或对象-工厂方式工厂方式的特点在函数内部创建对象,对象创建后动态定义对象的属性代码实现出现的问题在语义上不像使用带有构造函数的new运算符那么正规每次调用createEmployee(),都要创建新函数showName(),意味着每个对象都有自己的showName()版本functioncreateEmployee(name,gender){ varemp=newObject; =name; emp.gender=gender; emp.showName=function(){ alert(); }; returnemp;}vare1=createEmployee("张三","男");e1.showName();vare2=createEmployee("李四","女");e2.showName();定义类或对象-构造函数方式构造函数方式的特点无需在函数内部创建对象,而是使用this关键字代码实现出现的问题与工厂方式一样,构造函数也会重复生成函数functionEmployee(name,gender){ =name; this.gender=gender; this.showName=function(){ alert(); };}vare1=newEmployee("张三","男");e1.showName();vare2=newEmployee("李四","女");e2.showName();定义类或对象-原型方式原型方式的特点使用空构造来设置类名,使用对象的prototype属性,把它看成创建新对象所依赖的原型代码实现出现的问题使用原型方式时,不能通过构造函数传递参数初始化属性若属性是指向对象的指针,则创建的每个对象都共用同一个属性值。上面的例子中,每个对象都共用position属性指向的数组functionEmployee(){}E="张三";Etotype.gender="男";Etotype.position=newArray("项目经理","技术总监");Etotype.showName=function(){ alert();};vare1=newEmployee();e1.showName();定义类或对象-
混合的构造函数/原型方式混合的构造函数/原型方式的特点使用构造函数定义对象的所有非函数属性,使用原型方式定义对象的函数属性(方法)代码实现采用那种方式目前使用最广泛的是混合的构造函数/原型方式functionEmployee(name,gender){ =name; this.gender=gender; this.position=newArray("项目经理","技术总监");}Etotype.showName=function(){ alert();};vare1=newEmployee("张三","男");e1.showName();继承JavaScript中继承的方式对象冒充使用call()方法使用apply()方法原型链混合式继承-对象冒充对象冒充的原理构造函数使用this关键字给所有的属性和方法赋值。由于构造函数只是一个函数,所以可以将父类的构造函数作为子类的方法,然后调用它。子类就会收到父类在构造函数中定义的属性和方法。代码实现特点使用对象冒充可以实现多继承functionClassA(color){ this.color=color; this.showColor=function(){ alert(this.color); };}functionClassB(color,name){ this.parent=ClassA; this.parent(color); deletethis.parent;//delete关键字可以删除对象的属性(删除对ClassA的引用,防止ClassB的实例调用它)
=name; this.showName=function(){ alert(); };}varaObj=newClassA("black");varbObj=newClassB("red","tom");aObj.showColor();bObj.showColor();bObj.showName();functionClassA(color){ this.color=color; this.showColor=function(){ alert(this.color); };}functionClassB(color,name){ this.parent=ClassA; this.parent(color); deletethis.parent;//delete关键字可以删除对象的属性(删除对ClassA的引用,防止ClassB的实例调用它)
=name; this.showName=function(){ alert(); };}varaObj=newClassA("black");varbObj=newClassB("red","tom");aObj.showColor();bObj.showColor();bObj.showName();functionClassA(color){ this.color=color; this.showColor=function(){ alert(this.color); };}functionClassB(color,name){ this.parent=ClassA; this.parent(color); deletethis.parent;//delete关键字可以删除对象的属性(删除对ClassA的引用,防止ClassB的实例调用它)
=name; this.showName=function(){ alert(); };}继承-call()方法语法call([thisObj[,arg1[,arg2[,
[,.argN]]]]])说明第一个参数用来充当函数中的this引用的对象,其他参数都直接传递给函数自身代码实现functionClassB(color,name){ //this.parent=ClassA; //this.parent(color); //deletethis.parent;
ClassA.call(this,color); =name; this.showName=function(){ alert(); };}继承-apply()方法语法apply([thisObj[,argArray]])说明该方法和call()方法类似,只是第二个参数为一个数组,表示将数组中的元素作为函数的参数直接传递代码实现
functionClassB(color,name){ //this.parent=ClassA; //this.parent(color); //deletethis.parent;
ClassA.apply(this,newArray(color)); =name; this.showName=function(){ alert(); };}继承-原型链原理由于prototype对象的任何属性和方法都会被传递给那个类的所有实例,所以我们可以将父类对象作为子类的原型对象,从而达到继承父类中属性和方法的目的代码实现
functionClassA(){}ClassA.prototype.color="";ClassA.prototype.showColor=function(){ alert(this.color);};functionClassB(){}ClassB.prototype=newClassA();ClassB.="";ClassB.prototype.showName=function(){ alert();};vara=newClassA();varb=newClassB();a.color="blue";b.color="black";="tom";a.showColor(); //输出:blueb.showColor(); //输出:blackb.showName(); //输出:tom弊端:原型链不支持多重继承继承-混合方式混合方式的好处避免对象冒充必须使用构造函数所带来的问题避免原型链无法使用带参数函数代码实现functionClassA(color){ this.color=color;}ClassA.prototype.showColor=function(){ alert(this.color);};functionClassB(color,name){ ClassA.call(this,color); =name;}ClassB.prototype=newClassA();ClassB.prototype.showName=function(){ alert();};vara=newClassA("red");varb=newClassB("blue","tom");a.showColor(); //输出:redb.showColor(); //输出:blueb.showName(); //输出:tom闭包-1闭包是通过在对一个函数调用的执行环境中返回一个函数对象构成的。Javascript中每一个函数都是一个闭包。但通常我们说的闭包是指嵌套函数。闭包的主要用途通过内部函数读取外部函数的变量内部函数可以在外部函数的外面,访问外部函数的内部变量闭包-2一个简单的闭包代码functionf1(){ vart=1; functionf2(){ alert(++t); } returnf2;}varfn=f1();fn();第1行:创建一个外部函数f1第2行:创建一个局部变量t第3-5行:创建一个内部函数f2,在f2中访问局部变量t第6行:返回内部函数f2,注意这里返回的是f2(内部函数对象),并没有调用f2函数第8行:由于f1将返回f2,所以fn实际是引用了f2第9行:由于fn引用了f2,所以这里实际上是调用了f2函数闭包-3问题一:f2中可以访问到f1中t变量?答:内部函数可以访问外部函数中任何局部变量提醒:定义局部变量需要使用var关键字如果没有使用var关键字,那么将变成全局变量例如:functionf1(){ t=10;}f1();alert(t);闭包-4问题二:returnf2;为什么这里返回的是一个函数名?答:这里返回的不是函数名。在javascript中函数其实就是对象,而函数名其实是对函数对象的引用。所以这里的f2是一个函数对象,既然是对象当然可以作为返回值。我们还可以返回匿名函数,例如:看到了吗,直接将函数对象返回,这是一个匿名函数。这段代码和上段代码的执行结果是一样的functionf1(){ vart=1; returnfunction(){ alert(++t); };}闭包-5问题三:f2和f2()有什么区别?答:f2是对函数的引用,你可以看成是函数对象。而f2()则是执行函数。就像在我们的代码中varfn=f1();这里的fn表示一个引用,它将引用f1()执行完后返回的f2。而代码fn();这里表示执行fn所引用的函数,也就是f2函数。闭包-6问题四:f1();执行完后它的局部变量t不是应该被回收吗,为什么fn();还是能访问到t?答:f1是f2的父函数,而f2则被一个全局变量fn引用,这样f2将一直存在于内存中。f2的运行环境是f1,所以f1也会一直在内存中,不会在调用结束后被垃圾回收。闭包-7思考1:如果再次调用fn();结果会是什么?思考2:如果像下面这样结果会是什么?functionf1(){ vart=1; returnfunction(){ alert(++t); }}varfn=f1();fn();varfn1=f1();fn1();回调函数-1回调函数就是一个通过函数引用调用的函数在javascript中函数名就是函数的引用在javascript中回调函数的实现方式:定义一个回调函数提供函数实现的一方在初始化的时候,将回调函数引用注册给调用者当特定的事件或条件发生的时候,调用者使用函数引用调用回调函数进行处理回调函数-2一个简单的例子functioncallbackFn(){ alert("我是回调函数");}functionfn(callback){ callback();}fn(callbackFn);回调函数-3callbackFn函数就是一个回调函数fn函数是调用函数执行时将回调函数(callbackFn)的引用传递给调用函数(fn)在调用函数(fn)运行期间执行回调函数(callbackFn)回调函数-4思考:如果回调函数带参数该如何调用?注意:通常情况下当调用函数(fn)定义好以后是不允许修改的。functioncallbackFn(i,j){ alert(i+j);}functionfn(callback){ callback();}fn(callbackF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 04年O公司人工智能语音识别技术研发合同
- 《476例结肠癌临床病理特征及预后比较分析》
- 《融合通信系统中分布式存储引擎的设计与实现》
- 2024城市地铁建设设备采购及安装服务合同
- 2024年快递店业务外包合同
- 2024年度舞台设备安装合同
- 2024年银川客运车资格证考试题库及答案
- 2024年乌鲁木齐道路运输客货从业资格证考试题库
- 2024年绵阳客运从业资格证理论考试题
- 2024年克拉玛依客运上岗证模拟考试题答案
- 车间生产计划完成情况统计表
- 品管圈(QCC)降低ICU护士床头交接班缺陷率课件
- 《左道:中国宗教文化中的神与魔》读书笔记模板
- 2023年初级游泳救生员理论知识考试题库(浓缩400题)
- 施工现场临时用电安全技术规范
- 同仁堂药品目录
- 社会问题概论
- 高中语文-如何读懂古诗词教学设计学情分析教材分析课后反思
- 虚假诉讼刑事控告书(参考范文)
- 部编版道德与法治四年级上册第11课《变废为宝有妙招》优质课件
- 2018年考研英语一真题和答案完整版
评论
0/150
提交评论