`
firefly_zp
  • 浏览: 19273 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

由 OO 继承来谈谈 javascript 继承

阅读更多
在大多数面向对象语言中,基本上的都支持继承,首先来宽泛的谈谈大多数 OO 语言的继承方式,之后具体到 javascript 来看看其继承有什么不同之处。

1. 实现继承:实现继承是指派生类(子类)继承了基类(父类)的所有属性和方法,并且有且只有一个基类。

优点是可以直接使用基类的所有属性和方法,缺点不言而喻,基类的一些不必要的方法也会被子类所继承。

比如:基类定义了果树类,里面有开花,结果等方法。派生类继承基类,但如果派生类的中的果树不会开花,只会结果(如:无花果),那么开花对子类就没用,但子类确实继承了基类开花的方法。

在设计模式中,我们更多强调的是面向接口的继承。上面的例子中,果树有两个接口,一个是开花,一个是结果。如果我的果树只能结果,不会开花的话,那么只要我的果树实现结果的接口就行了。与此同时不会把开花带入到我的派生类(子类)中。

2. 接口继承:派生类继承了接口的方法签名,它不同于实现继承的是,接口继承允许多继承,同时派生类只继承了方法签名而没有方法实现。具体的实现必须在派生类中完成。这种继承又称为“接口实现”。

谈完了 OO 语言继承的分类,下面对比上述两种方式来看看 javascript 是怎么来完成它独有的继承的。

先看第二点——接口继承,接口继承要求派生类继承基类的方法签名。

方法签名:返回值类型+方法名+参数列表

而在 javascript 中,任何的函数,方法,究其本质都会转变成变量来解析,如下:

//定义式
function a(){
    alert("pluto");
}

//变量式
var a = function(){
    alert("Pluto");
}


两种声明方式除了写法不同,执行顺序不同(定义式在编译时会自动提前)之外,其余都相同。并且由第二种方法可以看出,函数其实是一个命了名的变量而已。

由于函数没有签名,所以接口继承的方式在 javascript 中就不复存在了。

下面着重来谈谈第一点——实现继承。

实现继承主要是依靠 javascript 中的原型链来实现,并且将原型链作为实现继承的主要方法。

回顾一下构造函数,原型,实例之间的关系:构造函数都有一个原型对象(prototype),原型对象(prototype)都有一个回指构造函数的指针(constructor),而实例包含一个指向原型对象的指针(__proto__)。如果将“Fruit”的实例赋值给另外一个构造函数 “NotFruit” 的原型对象:即:

function Fruit(){
    this.fruit = true;
}
			
Fruit.prototype.isFruit = function(){
    return this.fruit;
}
			
function NotFruit(){
    this.notFruit = false;
}
			
NotFruit.prototype = new Fruit();//将  Fruit()的实例赋值给另外一个构造函数 (NotFruit) 的原型对象 (NotFruit.prototype)
			
NotFruit.prototype.isNotFruit = function(){
    return this.notFruit;
}
			
var dog = new NotFruit(); // 创建派生类(子类)的实例 dog
			
alert(dog.isFruit());    // 输出 true
alert(dog.isNotFruit()); // 输出 false
alert(dog.notFoundFruit()); // 报错  dog.notFoundFruit is not a function


则此时的原型对象包含了一个指向另外一个原型对象的指针。如下图诠释:



如上所示,便完成了 javascript 通过原型对象的方式的继承。

原型链表明实例化的对象首先会在构造函数的实例中搜索该属性,如果没有找到,则会继续搜索实例的原型。通过原型链实现继承,搜索过程会沿着原型链向上搜索,拿上面的例子来说,调用 dog.isFruit() 会经历三个搜索步骤:1)搜索实例(未找到) --> 2)搜索 NotFruit.prototype (未找到) --> 3) 搜索 Fruit.prototype,上面这个例子在调用 dog.isFruit() 时,在第三步才找到其对应的方法。如果在搜索到原型末端还未找到属性或方法时,则会报错,如上 dog.notFoundFruit() 所示。

当然,在 javascript 中,还存在“对象冒充”的方式的继承,在这里就不详细论述了。
  • 大小: 264.4 KB
分享到:
评论
3 楼 mingliang_luo 2011-11-28  
一般,推荐《javascript高级程序设计》的面向对象设计和闭包那两章,讲得更详细
2 楼 指甲刀X 2011-11-28  
学习鸟
1 楼 loginin 2011-11-15  

相关推荐

    【JavaScript源代码】简单谈谈JavaScript寄生式组合继承.docx

    简单谈谈JavaScript寄生式组合继承  组合继承也被称为伪经典继承,它综合了我们昨天说的原型链和盗用构造函数,将俩者的有点结合在了一起。它的基本思想是使用原型链继承原型上的属性和方法,通过盗用构造函数继承...

    【JavaScript源代码】深入JS继承.docx

     目录 前言准备总结继承的n种方式原型式继承原型链式继承借用构造函数(类式继承)组合继承寄生组合式继承结束语 前言 准备 总结 继承的n种方式 原型式继承原型链式继承借用构造函数(类式继承)组合继承寄生组合...

    【JavaScript源代码】JavaScript继承的三种方法实例.docx

     继承 继承: 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承。  继承也是为了数据共享,js中的继承也是为了实现数据共享  我们可以联想到原型...

    javascript继承基础

    封装,继承,多态是oo语言的三大性质,javascript虽然不是纯的oo语言,但它也有继承机制

    oojs:面向对象 javascript 库的强大功能

    OOjs 是一个用于处理对象的 JavaScript 库。 主要功能包括继承、mixin 和用于处理对象的实用程序。 /* Example */ ( function ( oo ) { function Animal ( ) { } function Magic ( ) { } function Unicorn ( )...

    JavaScript是如何实现继承的(六种方式)

    大多OO语言都支持两种继承方式: 接口继承和实现继承 ,而ECMAScript中无法实现接口继承,ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现,下文给大家技术js实现继承的六种方式,需要的朋友参考下

    encapsulate:JavaScript OO系统

    Encapsulate是一个用于JavaScript的紧凑的OO系统,它允许您结合使用特征(对象或提供成员的函数)和其他实例化器(您可能将其称为继承)来轻松创建对象实例化器(您可能将它们称为类)。 封装类似于在许多方面和...

    深入理解javascript原型链和继承

    javascript本身不是面向对象的语言,而是基于对象的语言,对于习惯了其他OO语言的人来说,起初有些不适应,因为在这里没有“类”的概念,或者说“类”和“实例”不区分,更不要指望有“父类”、“子类”之分了。...

    【JavaScript源代码】JavaScript中的几种继承方法示例.docx

    JavaScript中的几种继承方法示例  1.原型链继承  原理: 子类原型指向父类实例对象实现原型共享,即Son.prototype = new Father()。 这里先简单介绍下原型 js中每个对象都有一个__proto__属性,这个属性指向的...

    JavaScript_oo:javascript面向对象

    JavaScript-oo类类(Class)定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的(它的行为)。举例来说,“狗”这个类会包含狗的一切基础特征,即所有“狗”都共有的特征或行为,例如它的孕育、...

    JavaScript面向对象编程指南(第2版)

    , 本书全面地覆盖了JavaScript语言的OO特性,同时兼顾基础知识,对初学者来说,是难得的JavaScript佳作。读者不需要具备任何的JavaScript基础知识及项目经验,通过学习这本书,将会在面试有关JavaScript程序设计的...

    oo_practice_javascript

    oo_practice_javascript 键入“茉莉花”以运行测试 不要放弃希望 通过测试

    JavaScript.Object.Programming.148421

    What are and how to use OO principles in JavaScript How to use Constructors with JavaScript and more Audience This book is for both intermediate and advanced JavaScript and Web development ...

    Professional JavaScript for Web Developers英文版

    This book is aimed at three groups of readers: Experienced object-oriented programming developers looking to learn JavaScript as it relates to traditional OO languages such as Java and C++; Web ...

    JavaScript模拟实现继承的方法

    我们都知道,在JavaScript中只能模拟实现OO中的”类”,也就意味着,在JavaScript中没有类的继承。我们也只能通过在原对象里添加或改写属性来模拟实现。 先定义一个父类, //父类 function ParentClass() { this....

    javascript 封装技术

    全面介绍如何用OO方式封装Javascript,高手必看。

    【JavaScript源代码】一篇文章教你JS函数继承.docx

    【JavaScript源代码】一篇文章教你JS函数继承.docx

    OO in JavaScript

    这是一篇深入探讨JavaScript对象模型的文章。 JavaScript是基于原型的语言,她的弱类型成为她缺点的同时也使得她非常灵活。作者对JavaScript的原型的应用使读者对面向对象的机制有了新的认识。对于想深入了解...

    ABAP OO的八个理由

    4.ABAP OO是你可以通过接口(interface)来调用对象的业务逻辑,而不是直接去使用对象,这样就避免了你需要详细了解每一个对象的特定功能 5.ABAP OO非常容易与事件驱动的模式结合在一块 6.ABAP OO更加明确所以更易于...

    javascript面向对象技术基础

    javascript面向对象技术基础

Global site tag (gtag.js) - Google Analytics