ECMAScript面向对象(三)——之继承

1.原型链方式

主要利用原型对象,让引用类型A的的prototype属性指向另一个引用类型的实例,从而继承另一个引用类型的属性和方法。

问题
1.无法在创建子类的时候向父类的构造函数传递参数
2.父类中有引用类型的属性的话,只要子类实例中有操作,所有的都会受到影响

 function Annimal(c){
     this.annimalClass=c;
     this.eat=function(){
         console.log(‘eatting.....‘);
     };
   this.runing=function(){
       console.log(‘runing.............‘);
   };
 }

// sub
function Felidae(ftype){
    this.Ftype=ftype;
}

// 先继承
Felidae.prototype=new Annimal("Felidae");

// 再添加或重写父类的方法
Felidae.prototype.like=function(h){
    console.log(h);
}

// 使用

var cat=new Felidae("cat");

// 从父类继承了runing方法
cat.runing();  

  2.借用构造函数

利用函数的父函数call方法实现继承。

问题:1.子类可以继承父类在构造函数中定义的属性和方法,但是方法无法复用
2.但是父类在原型中定义的属性和方法对子类是不可见的
// 借用构造函数
function SuperType(){
    this.arr=[1,2,3];
}

SuperType.prototype.show=function(){
    console.log(this.arr);
}

function SubType(){
    SuperType.call(this);
}

 var sub1=new SubType();
 sub1.arr.pop();
 console.log(sub1.arr);//[1,2]
 var sub2=new SubType();
  sub2.arr.push(20);
 console.log(sub2.arr);//[1,2,3,20]

 // 子类可以继承父类在构造函数中定义的属性和方法
 // 但是父类在原型中定义的属性和方法对子类是不可见的
 sub1.show();//sub1.show is not a function

 var sup1=new SuperType();
 sup1.show();//[1,2,3]

3.组合继承(原型链+构造)

function SuperType(fname){
    this.fileName=fname;
    this.arr=[1,2,3];
}

SuperType.prototype.show=function(){
    console.log(this.arr);
}

// 继承
function SubType(fname,size){
    SuperType.call(this,fname);//构造函数
    this.size=size;
}

// 原型继承
SubType.prototype = new SuperType();
SubType.prototype.constructor=SubType;
//添加新方法
SubType.prototype.showF=function(){
 console.log("name:"+this.fileName+"\r\n"+"size:"+this.size+"kb");
};

var sub1=new SubType("todo.txt",512);
   sub1.show();
   sub1.showF();

  console.log(sub1 instanceof SubType);//true
  console.log(sub1 instanceof SuperType);//true
  console.log(sub1 instanceof Object);//true

4.原型式继承

使用一个已存在的实例对象作为,子类的原型对象。

// 原型式继承
// 用于在一个已有的对象实例上拓展新的方法
 function object(o){
    function F(){}
     F.prototype=o;
     F.prototype.show=function(){
         for ( var agr in o){
             console.log(agr);
         }
     }
     return new F();
 }
 var p={
     arr:[1,2,3],
     name:"done"
 }

var p1=object(p);
 p1.show();

 var p2=object(p);
 p2.arr.pop();
 console.log(p2.arr);
 console.log(p1.arr);

5.寄生继承

// 寄生式继承
 function createAn(o){

     var onew = object(o);//沿用上面的原型式继承的object函数
     onew.show1=function(){//添加自己的方法
         console.log("show1......");
     };

     return onew;
 }

var a1=createAn(p);
    a1.show1();

6.寄生组合继承(寄生+构造+原型链)

使用寄生式继承来继承超类的原型,然后将结果指定给子类的原型。

// 寄生组合式继承
//与原型构造组合类似,知识这里使用了一个寄生函数来实现原型链继承
//
// 用寄生的方式将【原型构造组合】下面的包装起来,使用的时候用下面的函数替换掉组合继承里面的代码即可
// SubType.prototype = new SuperType();
// SubType.prototype.constructor=SubType;

 inheritProto(SubType,SuperType)
 {
      var proto=object(SuperType.prototype);//用父类的原型创建一个新的对象
       proto.prototype.constructor=SubType;
       SubType.prototype=proto;
 }
时间: 2024-10-22 20:26:50

ECMAScript面向对象(三)——之继承的相关文章

重修课程day22(面向对象三之继承和派生)

面向对象的三大特性:封装,继承和多态 一 继承 1 什么是继承:1.1 什么是什么的关系.一个类是另一个类的子类. 1.2 继承是一种创新类的方式.新建的类可以继承一个或多个父类.父类又称为基类或超类,新建的类又称为派生类或子类 继承一个父类叫做单继承:继承多个父类叫做多继承. 2 继承的好处:减少代码的冗余,增强了代码的重用性. 二 继承的用法 super:调用父类的功能和方法 格式一:在子类的内部调用父类的属性和方法 class 父类名: def  属性(self): 功能 class 子类

C++ Primer学习笔记32_面向对象编程(3)--继承(三):多重继承、虚继承与虚基类

C++ Primer学习笔记32_面向对象编程(3)--继承(三):多重继承.虚继承与虚基类 一.多重继承 在C++语言中,一个派生类可以从一个基类派生,称为单继承:也可以从多个基类派生,称为多继承. 多重继承--一个派生类可以有多个基类 class <派生类名> : <继承方式1> <基类名1>,<继承方式2> <基类名2>,... { <派生类新定义成员> }; 可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于一个

面向对象三要素:封装,继承,多态

面向对象三要素是:封装 继承 多态 封装 封装就是事物抽象为类,把对外接口暴露,将实现和内部数据隐藏. 继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为"子类"或"派生类". 被继承的类称为"基类"."父类"或"超类". 继承的过程,就是从一般到特

javascript面向对象(三)--继承

1 //继承: ECMAScript只支持 实现继承 依靠原型链来实现 2 //一.原型链 3 //先来理清下关系: 4 //每个构造函数都会有一个原型对象 Person --> prototype 5 //每一个原型对象都会有一个指向构造函数的指针 Person.prototype.constructor --> Person 6 //每一个实例都包含一个指向原型对象的内部指针 person1 --> prototype 7 //当原型对象等于另一个类的实例的时候,那么原型对象就会包含

Python之面向对象(三)继承详解以及面向对象三大特性

6.4 面向对象之:继承 面向对象的继承简介:继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A"继承自"另一个类别B,就把这个A称为"B的子类别",而把B称为"A的父类别"也可以称"B是A的超类".继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码.在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能

面向对象三要素

面向对象三要素 Posted on 2009-12-11 09:06 我不是高手 阅读(3595) 评论(1) 编辑 收藏 面向对象三要素是:封装 继承 多态 封装 封装就是事物抽象为类,把对外接口暴露,将实现和内部数据隐藏. 继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”.继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为“子类”或“派生类”. 被继承的类称为“基类”.“父类”或“超类”. 继承的过程,

Lua面向对象----类、继承、多继承、单例的实现

(本文转载)学习之用,侵权立删! 原文地址   http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&utm_medium=referral lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现.

C++ Primer 学习笔记_31_面向对象编程(2)--继承(二):继承与构造函数、派生类到基类的转换 、基类到派生类的转换

C++ Primer 学习笔记_31_面向对象编程(2)--继承(二):继承与构造函数.派生类到基类的转换 .基类到派生类的转换 一.不能自动继承的成员函数 构造函数 拷贝构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数). 派生类的构造函数需要给基类的构造函数传递参数 #include <iostream

JavaScript中OOP——&gt;&gt;&gt;面向对象中的继承/闭包

  前  言  OOP  JavaScript中OOP-->>>面向对象中的继承/闭包 1.1面向对象的概念 使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.      >>> 继承的两方,发生在两个类之间. 1.2JS模拟实现继承的三种方式:        首先,了解一下call/apply/binb:通过函数名调用方法,强行将函数中的this指向某个对象:            call写法:  func.call(func的this指向的obj,参数