Javascript对象继承.doc_第1页
Javascript对象继承.doc_第2页
Javascript对象继承.doc_第3页
Javascript对象继承.doc_第4页
Javascript对象继承.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

在Javascript中,一切皆是对象,所谓的类也只是用来模拟其它面向对象语言的class的对象而已,例如:function MyClass() /定义一个类MyClass.call();/其实这个类本身也是一个对象 在上面的代码中,并没有为MyClass定义call方法,但是却可以调用call方法,其原因就是JavaScript的原生对象在发挥作用。通过 function关键字定义一个类,实质上就是实例化一个Function的实例,因为Javascript在Function的原生对象中定义了 call方法,所以即使MyClass的定义是空的,但是还是可以调用call方法!由此,我们就可以看到继承的影子! 在原生对象中定义的方法call被继承到了MyClass中,那么只要修改一下原生对象,那么就可以模拟出面向对象的继承机制了。 function MyBaseClass() this.Add = function(a, b) return a + b; function MyClass() MyCtotype = new MyBaseClass(); var obj = new MyClass(); var X = obj.Add(3, 4);只要把MyClass的原生对象指向基类MyBaseClass的实例对象,那么MyClass就可以继承MyBaseClass中的方法,从而实现了继承机制! 多继承 任何对象的直接原生对象都只有一个,那么如果想实现多继承该怎么办呢?可以采用两种办法: 方法一:链状继承 function MyBaseClassA() this.Add = function(a, b) return a + b; function MyBaseClassB() this.Sub = function(a, b) return a - b; function MyClass() MyBaseClassB.prototype = new MyBaseClassA(); MyCtotype = new MyBaseClassB(); var obj = new MyClass(); var X = obj.Add(3, 4); var Y = obj.Sub(9, 4);方法二:拷贝继承 function MyBaseClassA() this.Add = function(a, b) return a + b; function MyBaseClassB() this.Sub = function(a, b) return a - b; function MyClass() var A = new MyBaseClassA(); for (var method in A) MyCtotypemethod = Amethod; var B = new MyBaseClassB(); for (var method in B) MyCtotypemethod = Bmethod; var obj = new MyClass(); var X = obj.Add(3, 4); var Y = obj.Sub(9, 4);继承的本质就是属性拷贝,所以只要手动拷贝基类的所有属性,那么就可以实现多继承了,对于拷贝属性的代码可以封装一下,便于调用: var Extend = function(DeriveClass,BaseClass) var o = new BaseClass(); for (var method in o) DeriveCtotypemethod = omethod; Extend(MyClass, MyBaseClassA); Extend(MyClass, MyBaseClassB);构造参数:继承是实现了,但是如果有构造参数有又该怎么处理呢?答案就是在派生类中调用基类构造就可以了: function MyBaseClass(a, b) this.A = a; this.B = b; this.Add = function() return this.A + this.B; function MyClass(a,b,c) MyBaseClass.call(this, a, b);/调用基类的构造 var Extend = function(DeriveClass, BaseClass) var o = new BaseClass(); for (var method in o) DeriveCtotypemethod = omethod; Extend(MyClass, MyBaseClass); var obj = new MyClass(4,5,8); var X = obj.Add(); alert(X);/结果:9 call和apply方法是经常用到的两个方法,其作用就是在另一个域内调用方法! 继承机制带来的另一个问题就是同名方法隐藏问题!Javascript对象都是由原型对象生成,原型对象也有其自己的原型对象,这样就构成了一条原型对象 链,对象链的顶端指向Object原生对象,末端就是对象本身,如果对象链中存在同名的方法,那么对象链末端的方法访问优先级高于顶端的优先级,因此派生 类的方法总是隐藏基类的方法:var BaseClass=function()this.Hello=function()return A;this.say=function()return Saying A;var BaseObj = new BaseClass();var X = BaseObj.Hello();alert(X);/结果:ABaseCtotype.Hello=function(a,b)return B;var Y = BaseObj.Hello();alert(Y);/结果:Avar MyClass = function()this.Hello=function()return C;var Extend = function(DeriveClass, BaseClass) var o = new BaseClass(); for (var method in o) DeriveCtotypemethod = omethod; Extend(MyClass, BaseClass);var MyObj = new MyClass();var Z = MyObj.Hello();alert(Z);/结果:CMyCtotype.Hello=function()return D;MyCtoty

温馨提示

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

评论

0/150

提交评论