第六章:继承

1、构造器工作模式——原型链法:

  Child.prototype = new Parent();   //Child.prototype.constructor改变了,成为Parent

  Child.prototype.constructor = Child;

2、构造器工作模式——仅从原型链继承法(速度越快,不需要新建对象实例,不存在链,缺点:子对象修改会影响到父对象,此方法不好,最好不要使用)

  Child.prototype = Parent.prototype;

  Child.prototype.constructor = Child;

3、构造器工作模式——临时构造器法(利用空函数来原型继承,父对象不会受到子对象的影响

  function exend(Child,Parent){

    var F = function(){};

    F.prototype = Parent.prototype;

    Child.prototype = new F();

    Child.prototype.constructor = Child;

  child.uber = Parent.prototype;   //可以找到父对象                     =〉 uber在constructor下,即xxx.constructor.uber访问

  }

4、构造器工作模式——原型属性copy法(注意这里不支持引用类型的copy)

  function extend2(Child,Parent){

    var p = Parent.prototype,

      c = Child.prototype;

    for (var i in p){

      c[i] = p [i]

    }

    c.uber = p;                     =>  uber在__proto__下面,即XXX.uber访问

  }

5、对象工作模式——全属性copy法(注意这里不支持引用类型的copy)

  function extendCopy(p){

    var c = {};

    for (var i in p){

      c[i] = p[i];

    }

    c.uber = p;         =>uber就在对象下面,即XXX.uber即可

    return c;

  }

6、对象工作模式——深拷贝法(此方法建议使用hasOwnProperty不会误copy不需要的继承属性,还需要判断是否是对象,若为对象需要进行递归)

  function deepCopy(p,c){
    var c = c || {};
    for (var i in p){
      if (p.hasOwnProperty(i)){

        if (typeof p[i] ===‘object‘){

          c[i] = Array.isArray(p[i]) ? [] : {};

          deepCopy(p[i],c[i]);

        } else {
          c[i] = p[i];
        }
      }
    }

    c.uber = p;
    return c;

  }

  如何不支持Array.isArray()函数,可以如下实现

  if ( typeof Array.isArray != ‘function‘ ){

    Array.isArray = function(value){

      return Object.prototype.toString.call(value) == ‘[object Array]‘

    }

  }

7、对象工作模式——原型继承法(跟3很像,使用原型链模式)

function object(o){

  var n,

    F = function(){};

  F.prototype = o;

  n = new F();

  n.uber = o;

  return n;

}

8、对象工作模式——扩展与增强模式(方法7+方法5的结合)

function objectPlus(o,stuff){

  var n,

    F = new function(){};

  F.prototype = o;

  n = new F();

  n.uber = o;

  for ( var i in stuff ){

    n[i] = stuff[i]

  }

  return n;

}

9、对象工作模式——多重继承法(也类似copy继承的形式)

function multi(){

  var n,

    stuff,

    j = 0,

    len = arguments.length;

  for (var j=0,j<len,j++){

    stuff = anguments[j];

    for (var i in stuff){

      if ( stuff.hasOwnProperty(i)){

        n[i] = stuff[i];

      }      

    }

  }

  return n;

}

10、对象工作模式——寄生继承法(调用方法7,原型继承法,使用原型链模式)

function parasite(victim){

  var that = object(victim);

  that.more = 1;

  return that;

}

11、构造器工作模式——构造器借用法(可以结合方法1使用)

function Child(){

  Parent.apply(this,arguments)       //自身属性的继承

}

Child.prototype = new Parent();          //原型的继承

Child.prototype.constructor = Child;

12、构造器工作模式——构造器借用和属性copy法(结合方法4原型属性copy法)

function Child(){

  Parent.apply(this,arguments)

}

extend2(Child,Parent)

13、构造器工作模式——使用Object.create实现类式继承

function Child(){

  Parent.apply(this,arguments)

}

Child.prototype = Object.create(Parent.prototype)   //Object.create内部实现就是方法3

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create

时间: 2024-12-24 03:25:20

第六章:继承的相关文章

《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章  继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章将帮助你解决许多常见的.复杂的建模问题,并解决你可能在现实中遇到的建模问题. 本章以多对多关系开始,这个类型的关系,无论是在现存系统还是新项目的建模中都非常普遍.接下来,我们会了解自引用关系,并探索获取嵌套对象图的各种策略.最后,本章以继承的高级建模和实体条件结束. 6-1  获取多对多关联中的链接表 问题

《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13  在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体,允许基类被实例化. 解决方案 假设你有如图6-20所示的模型. 图6-20 包含Invoice实体的模型 这个模型只包含一个单独的实体Invoice(发货单).我们想从Invoice派生一个新的实体,它表示删除掉的发货单.这将允许我们以更清晰的业务逻辑来分别对有效的发货单和已删除掉的发货进行不同的操作.按下面

《Entity Framework 6 Recipes》中文翻译系列 (35) ------ 第六章 继承与建模高级应用之TPH继承映射中使用复合条件

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-11  TPH继承映射中使用复合条件 问题 你想使用TPH为一张表建模,建模中使用的复杂条件超过了实框架能直接支持的能力. 解决方案 假设我们有一张Member表,如图6-15所示.Member表描述了我们俱乐部的会员信息.在我们的模型中,我们想使用TPH为派生类,AdultMember(成人会员).SeniorMember(老年人会员)和TeenMember(青少年会员)建模. 图6-

《Entity Framework 6 Recipes》中文翻译系列 (33) ------ 第六章 继承与建模高级应用之TPH与TPT (2)

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-8  嵌套的TPH建模 问题 你想使用超过一层的TPH继承映射为一张表建模. 解决方案 假设你有一张员工(Employee)表,它包含各种类型的员工,比如,钟点工,雇员.如图6-10所示. 图6-10 包含各种类型的员工表 Employee表包含钟点工,雇员,提成员工,这是雇员下面的一个子类型.按下面的步骤,使用派生类型HourlyEmployee,SalariedEmployee和Sa

《Entity Framework 6 Recipes》中文翻译系列 (32) ------ 第六章 继承与建模高级应用之TPH与TPT (1)

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-6  映射派生类中的NULL条件 问题 你的表中,有一列允许为null.你想使用TPH创建一个模型,列值为null时,表示一个派生类型,不为null时,表示另一个派生类型. 解决方案 假设你有一张表,描述医学实验药物.这张表包含一列指示该药是什么时候批准生产的.药在批准生产之前都被认为是实验性的.一但批准生产,它就被认为是药物了.我们就以图6-7中Drug表开始我们这一小节的学习. 图6

《Entity Framework 6 Recipes》中文翻译系列 (36) ------ 第六章 继承与建模高级应用之TPC继承映射

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-12  TPC继承映射建模 问题 你有两张或多张架构和数据类似的表,你想使用TPC继承映射为这些表建模. 解决方案 假设我们有如图6-18所示的表. 图6-18 表Toyota和BMW有相似的结构,它们可以成为派生至实体Car的派生类型 在图6-18中,表Toyota和BMW有相似的架构(Schema),并描述类似的数据.BMW表只多了额外的一列,它用一bit值来指示对应的实例是否具有避

《Entity Framework 6 Recipes》中文翻译系列 (34) ------ 第六章 继承与建模高级应用之多条件与QueryView

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-10  创建一个多条件过滤 问题 你想使用多个条件为实体过滤表中的行. 解决方案 假设你有一张处理网站订单的表,如图6-13所示. 图6-13 表WebOrder包含网站订单的信息 假设我们有这样一个业务需求,WebOrder中的实例为,2012年以后的,2010年到2012年之间未删除的,2010年以前的订单金额大于200美元的.这样的复杂过滤条件不能使用映射详细信息窗口中有限制的条件

第六章 继承和多态

1.继承有哪些特性: 1.单根性    2.传递性 2.父类的哪些成员可以被继承? 私有成员不能被继承,父类的构造 3.继承: 在C#中,如果一个类后面通过冒号又跟了另外一个类,那么我们就称冒号前面的类为子类, 冒号后面的类为父类,这种书写方式放映出来的关系就称为类的继承关系 4.子类:派生类   父类:基类或者超类 5.满足什么条件的类可以使用继承? 满足is a关系的两个类可以使用继承 例如:经理 is a 员工 6.如果new一个子类对象,那么如下操作流程: 1.先 定位到子类对应构造函数

《Entity Framework 6 Recipes》中文翻译系列 (31) ------ 第六章 继承与建模高级应用之自引用关联

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-4  使用TPH建模自引用关系 问题 你有一张自引用的表,它代表数据库上不同类型但关联的对象.你想使用TPH为此表建模. 解决方案 假设你有一张如图6-5所示的表,它描述了关于人的事,人通常会有一个心中英雄,他最能激发自己.我们用一个指向Person表中的另一个行的引用来表示心中的英雄. 图6-5  包含不同角色的Person表 在现实中,每个人都会有一个角色,有的是消防员,有的是教师,

第六章 初始继承和多态

一:本章目标 ①:理解继承的概念 ②:使用继承建立父类和子类以及继承的传递性.单根性 ③:访问修饰符 ④:多态的概念 ⑤:会使用虚方法实现多态 二:所谓继承: 在C#中,如果一个类后面通过冒号又跟了另外一个类,那么我们就称冒号前面的类为子类,冒号后面的类为父类.这种书写类的方式放映出来的关系就称为类的继承关系. 1.子类:派生类 父类:基类或者超类 2.满足什么条件的类可以使用继承?? 满足is a关系的两个类可以使用继承. 例如: 经理is a a 员工 程序员  is a 员工 学生 is