面向对象 ( OO ) 的程序设计——继承

仅支持实现继承,且主要依靠原型链来实现,不过一般会混合构造函数一起实现继承

1 原型链

    • 继承使用原型链进行传递,类似指针一层层向上指向对应原型,构成链状
    • 在使用原型链近似实现继承时,实例中的所有属性和方法都会被继承
       1 // 第一个类型
       2 function Func1(){
       3     this.property = true;
       4 }
       5 // 第一个类型的方法
       6 Func1.prototype.getFunc1Value = function(){
       7     return this.property;
       8 };
       9
      10 // 第二个类型
      11 function Func2(){
      12     this.func2property = false;
      13 }
      14
      15 // 第一个类型的实例赋给 Func2.prototype,实现继承 ( 替换原型 )
      16 Func2.prototype = new Func1();
      17
      18 // 为第二个类型增加了新方法
      19 Func2.prototype.getFunc2Value = function(){
      20     return this.func2property;
      21 };
      22
      23 // 为第二个对象创建实例
      24 var out = new Func2();
      25
      26 // 利用该实例访问第一个对象方法、属性及第二个对象的方法、属性
      27 console.log(out.getFunc1Value());
      28 console.log(out.property);
      29 console.log(out.getFunc2Value());
      30 console.log(out.func2property);

      继承实质为将父对象的替换为子对象的原型

      添加新方法或重写,均要放在替换原型语句后面重写是覆盖掉,原先的还在,子对象实例访问到的是重写的,父对象实例访问的是原先的方法

    • A 是 B 的实例

      A instanceof B;         //返回 true 或 false
    • A 是原型
      A.prototype.isProptotypeOf(instance);           //返回 true 或 false

2 借用构造函数

使用 call() 或 apply() 方法借用超类型 ( 父对象 ) 的构造函数

 1 // 构造函数1
 2 function Func1(){
 3     this.colors = ["red","blue","green"];
 4 }
 5
 6 // 构造函数2
 7 function Func2(){
 8     // 借用构造函数1
 9     Func1.call(this);
10 }
11
12 // 创建实例
13 var out2 = new Func2();
14 out2.colors.push("black");  // 为构造函数2的实例增加一个值
15 var out1 = new Func1();
16
17 // 输出可知每次新建实例均借用构造函数1,值不变
18 console.log(out1.colors);
19 console.log(out2.colors);
20 }

效果如下

3 传递参数

借用构造函数可以在子类型构造函数中向超类型构造函数传递参数

 1 // 构造函数1
 2 function Func1(name){
 3     this.name = name;
 4 }
 5
 6 // 构造函数2
 7 function Func2(){
 8     // 借用构造函数1
 9     Func1.call(this,"Cherry");
10     this.age = 21;
11 }
12
13 // 创建实例
14 var out2 = new Func2();
15
16 console.log(out2.name);
17 console.log(out2.age);

4 组合继承

将原型链和借用构造函数技术组合到一块,发挥二者之长。实质为使用原型链实现对原型属性和方法的继承,通过借用构造函数实现对实例属性的继承

组合继承是最常用的继承方法

5 寄生组合式继承

尽管组合继承已经十分好用了,但是由于会两次调用父类型的构造函数,导致效率较低,故提出了寄生组合式继承,仅调用一次父类型的构造函数,提高效率,是实现基于继承的最有效方式

示例:

 1 function inheritPrototype(subType, superType) {
 2     var prototype = superType.prototype;
 3     prototype.constructor = subType;
 4     subType.prototype = prototype;
 5 }
 6
 7 function SuperType(name) {
 8     this.name = name;
 9     colors = ["red", "blue", "green"];
10 }
11
12 SuperType.prototype.sayName = function () {
13     var out1 = document.getElementById("out1");
14     var p = document.createElement("p");
15     p.innerHTML = this.name;
16     out1.appendChild(p);
17 };
18
19 function SubType(name, age) {
20     SuperType.call(this, name);
21     this.age = age;
22 }
23
24 inheritPrototype(SubType, SuperType);
25
26 SubType.prototype.sayAge = function () {
27     var out1 = document.getElementById("out1");
28     var p = document.createElement("p");
29     p.innerHTML = this.age;
30     out1.appendChild(p);
31 };
32
33 var out1 = new SuperType("Bob");
34 var out2 = new SubType("Cherry",21);
35
36 console.log(out1);
37 console.log(out2);
38 out1.sayName();
39 out1.sayAge();
40 out2.sayName();
41 out2.sayAge();

效果如下,其中父类型构造函数没有 age ,故输出为 undefined

END~~~≥ω≤

时间: 2024-07-31 03:22:28

面向对象 ( OO ) 的程序设计——继承的相关文章

面向对象 ( OO ) 的程序设计——创建对象

为了避免大量重复代码产生,可采用以下方法创建对象 1 工厂模式 1 function createPerson(name,age,job){ 2 var o = new Object(); 3 o.name = name; 4 o.age = age; 5 o.job = job; 6 return o; 7 } 8 9 var person1 = createPerson("Bob",23,"Doctor"); 10 var person2 = createPer

面向对象 ( OO ) 的程序设计——理解对象

1 创建自定义对象 创建自定义对象的最简单方法为创建 Object 的实例,并添加属性方法,也可以使用对象字面量 2 访问器属性 访问器属性包括 getter 和 setter 函数,读取访问器属性时,调用 getter 函数,写入访问器属性时,调用 setter 属性 1 var people = { 2 _year: 1995, 3 age: 0 4 }; 5 6 Object.defineProperty(people, "year", { 7 get:function(){ 8

javascript面向对象程序设计——继承初步(by vczero)

上一篇说了javascript的封装,没有刻意去说javascript的“共有函数”.“私有函数”,因为个人觉得这只是作用域的问题,我们不能刻意的模仿强类型语言(C++/JAVA)而去编写代码.尊重每一门语言的特性才是最为重要的. 一.基于prototype原型的继承 1 var Person = function(name, age){ 2 this.name = name; 3 this.age = age; 4 } 5 6 Person.prototype = { 7 addUser: f

python的面向对象的特性(继承、封装、多态)

创建自已对象就python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象.以及面向对象的概念:继承.封装.多态. 多态: 可对不同类的对象使用同样的操作. 封装:对外部世界隐藏对象的工作细节. 继承:以普通的类为基础建立专门的类对象. 多态 面向对象程序设计最有趣的特性是多太,它是是让大多数人犯晕的特性.所以,先来介绍这个. 多态意思是"有多种形式".多态意味着就算不知道变量所引用的对象类是什么,还是能对它进行操作,而它也会根据对象(或类)类型的不同而表

设计模式 之 面向对象(OO)思维

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 面向对象(OO)思维: 1. 考虑类 名词 2. 考虑属性 不可脱离具体的应用环境 3. 考虑方法 4. 考虑类之间的关系 5. 考虑隐藏(封装) 降低耦合度 6. 考虑继承 耦合度强,应该谨慎使用 7. 考虑多态 核心中的核心,多态带来了可扩展性. 多态有三个特性:1继承:2重写:3 父类的引用指向子类的对象 面向对象设计时需注意的问题: 1. 设计没有绝对的对与错 2.

面向对象(一)—继承与多态

又一次深入的学习设计模式,发现了很多以前感觉不是问题的问题,这才发现原来自己不是真的理解了.通过这次的深入学习,才开始慢慢感受到OO的魅力所在. 从C#学习到设计模式,再到机房收费系统个人版和合作版,再到我们做的项目,我们真正的朝着面向对象编程了吗?我的项目中,先不说泛型.委托.集合的利用率,就是基本的继承.多态用的少之又少. 下面将为大家解说"OO引领编程"之--继承和多态 继承篇 一.简介 俗话说:龙生龙凤生凤,老鼠的儿子会打洞.可以理解为,继承就是小辈拥有父辈流传下来的东西. 在

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)最近进行数据库操作,遇到一个问题,就是大量删除一个数据表中的数据后,由于设定了id是自增的,导致再插入时,默认生成的id会很大,这个时候想要再次插入新的数据,应该怎么办呢?1.明确目前最后一个id的大小select id from tags order by id DESC limit 0,1; 假设返回的是9,则设置数据表从10开始自增 2.修改这个数据表从10开始自增alter table tags auto_increme

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承

面向对象编程 --转换与继承.复制控制与继承 I.转换与继承 引言: 由于每一个派生类对象都包括一个基类部分,因此能够像使用基类对象一样在派生类对象上执行操作. 对于指针/引用,能够将派生类对象的指针/引用转换为基类子对象的指针/引用. 基类类型对象既能够作为独立对象存在,也能够作为派生类对象的一部分而存在,因此,一个基类对象可能是也可能不是一个派生类对象的部分,因此,没有从基类引用(或基类指针)到派生类引用(或派生类指针)的(自己主动)转换. 关于对象类型,尽管一般能够使用派生类型的对象对基类