`
firefly_zp
  • 浏览: 20003 次
  • 性别: 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中,对象继承机制是一种非常重要的设计模式。常见的继承方式包括原型链继承、构造函数继承等。今天我们要探讨的是寄生式组合继承——一种结合了原型...

    javascript继承基础

    在面向对象(OO)编程领域中,封装、继承与多态被认为是三大核心特性。尽管JavaScript并非一种纯粹的面向对象语言,但其确实支持这些特性,并且能够实现对象之间的继承关系。本文将重点介绍JavaScript中的继承机制。...

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

    本文将深入探讨JavaScript中的三种主要继承方式,并通过具体的示例来帮助理解这些概念: 1. **借用构造函数(也称为经典继承)** 2. **原型链继承** 3. **组合继承** #### 二、继承的基本原理 在JavaScript中,...

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

    **原理**: 在JavaScript中,原型链继承是一种实现继承的方式,它通过让子类的原型对象指向父类的一个实例来实现属性和方法的共享。 - **核心概念**: 每个函数都具有一个`prototype`属性,该属性默认是一个空的对象...

    javascript面向对象技术基础

    在JavaScript中,对象是由键值对(key-value pairs)组成的关联数组,也就是字面量表示法`{key: value}`。这种结构允许我们将数据和行为封装在一起,形成具有特定功能的实体。例如,我们可以创建一个`Person`对象,...

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

    JavaScript中的继承机制是其灵活性和动态性的重要体现。在JavaScript中,有多种继承方式,每种方式都有其独特的实现原理和优缺点。本文主要探讨五种经典的继承方式:原型式继承、原型链式继承、借用构造函数(类式...

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

    本文将详细讲解JavaScript中的几种常见的函数继承方式,包括原型链继承、借用构造函数继承(对象伪装)、组合继承、寄生组合继承以及ES6引入的class继承。 **一、前言** 函数继承是JavaScript中实现对象之间属性和...

    oo_practice_javascript

    在"oo_practice_javascript"项目中,开发者可能会遇到如何定义和使用构造函数、原型方法、继承模式、封装策略以及实现多态等实践问题。通过编写和运行Jasmine测试,他们可以不断调整和优化代码,确保遵循良好的面向...

    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-OOJS:Javascript 中的面向对象编程

    JavaScript提供了原型链机制来实现继承,ES6引入了类(class)语法,使得继承更加简洁直观。 - 多态:同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。JavaScript中,多态主要体现在函数的动态...

    Javascript简单实现面向对象编程继承实例代码

    总之,Javascript虽然在语法上不同于其他面向对象的语言,但它提供了灵活的机制来实现面向对象的核心概念,使得开发者可以利用Javascript的面向对象编程特性来构建健壮的软件系统。通过使用构造函数、原型链、`class...

    JavaScript_oo:javascript面向对象

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

    object-oriented-javascript

    面向对象的 JavaScript(简称 OOJS)是一种编程范式,它利用 JavaScript 的特性来实现面向对象的编程方式。面向对象编程(OOP)是现代软件工程中一个非常重要的概念,它通过将数据与操作这些数据的方法绑定在一起,...

    OOExample继承多接口反射在多态时的比较(VB.net)

    总结来说,这篇博客文章通过实例和比较,揭示了VB.NET中继承、多接口、反射以及它们在多态场景下的应用。开发者可以根据项目需求和场景选择合适的设计策略,以提高代码的可维护性和灵活性。理解并熟练运用这些概念,...

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

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

    JavaScript面向对象编程

    JavaScript中提供了多种实现继承的方式,如原型链继承、构造函数继承、组合继承、寄生组合继承等。ES6引入的class语法糖也支持类继承,使得代码更易于理解和维护。 4. 多态 多态是指同一种操作可以作用于不同类型的...

    ABAP OO的八个理由

    3. 继承与代码复用:通过继承,ABAP OO可以重用已有类的方法,只需要编写新类特有的功能,减少了代码冗余,提高了可维护性。面向过程编程中,代码复用通常需要复制和粘贴,难以实现灵活扩展。 4. 接口与业务逻辑:...

Global site tag (gtag.js) - Google Analytics