zoukankan      html  css  js  c++  java
  • js高级教程 第六章-面对对象的程序设计(四)

    • 原型链
      1.作用:实现继承的主要方法
      2.基本思想:利用原型,让一个引用类型继承另一个引用类型。
      3.概念:A构造函数都有一个A原型对象,A原型对象都包含一个指向构造函数的指针。而A实例有一个指向A原型对象的指针。如果A原型对象同时又是B类型的一个实例,那么A原型对象(B类型的一个实例)就有一个指向B类型的实例,依次类推,构成的原型与实例的链条就是原型链。
    function SuperType(){
       this.prototype = true;
    }
    
    SuperType.prototype.getSuperType = function(){
      return this.prototype;
    }
    
    function SubType(){
      this.subprototype = false;
    }
    
    // SubType的原型作为SuperType的实例来继承SuperType的方法
    SubType.prototype = new SuperType();
    
    // instance作为SubType的一个实例
    var instance = new SubType();
    alert(instance.getSuperType());

    PS:现在的SubType的constructor指向的是SuperType

    原型搜索机制:前面的章节又提到过原型的搜索机制,在以读取模式访问实例属性的时候,会按照实例-原型的顺序搜索。而使用原型链继承的情况是:实例-本身的原型-父类的原型(如果还有祖父类,曾祖父类则继续向上)

    另一个层次的继承:上面的继承其实还包含一个默认的继承,那就是对于Object的继承,因此才会继承toString,valueOf这样的方法。这个继承的模型是这样的。

    Created with Raphaël 2.1.0继承关系SubTypeSuperTypeObject
    • 判断实例和原型的关系
      1.使用instanceof
    function SuperType(){
       this.prototype = true;
    }
    
    SuperType.prototype.getSuperType = function(){
      return this.prototype;
    }
    
    function SubType(){
      this.subprototype = false;
    }
    
    // SubType的原型作为SuperType的实例来继承SuperType的方法
    SubType.prototype = new SuperType();
    
    // instance作为SubType的一个实例
    var instance = new SubType();
    alert(instance instanceof SubType);//true
    alert(instance instanceof SuperType);//true
    alert(instance instanceof Object);//true

    2.使用isPrototypeOf

    alert(SubType.prototype.isPrototypeOf(instance));//true
    alert(SuperType.prototype.isPrototypeOf(instance));//true
    alert(Object.prototype.isPrototypeOf(instance));//true
    • 关于在子类型中定义方法的问题
      原型添加的方法要在替换原型的语句后面
    function SuperType(){
       this.prototype = true;
    }
    
    SuperType.prototype.getSuperType = function(){
      return this.prototype;
    }
    
    function SubType(){
      this.subprototype = false;
    }
    
    // SubType的原型作为SuperType的实例来继承SuperType的方法
    SubType.prototype = new SuperType();
    // 一个添加的SubType方法
    SubType.prototype.getSubType = function(){
      return 1;
    }
    // 重写的SuperType的方法,但是在SuperType本身中并没有改变
    SubType.prototype.getSuperType = function(){
      return false;
    }
    
    // instance作为SubType的一个实例
    var instance = new SubType();
    alert(instance.getSuperType());//false
    • 借用构造函数
      1.基本思想:在子类型构造函数的内部调用超类型的构造函数。
      2.方法:call或者apply实现
    function superType(){
      this.color = ['red','black'];
    }
    
    function subType(){
      superType.call(this);
    }
    
    var instance1 = new subType();
    instance1.color.push('blue');
    alert(instance1.color);//red black blue
    
    var instance2 = new subType();
    alert(instance2.color);//red black

    虽然所有的实例拥有了超类型的superType,但是每个实例修改超类型产生的都是副本,不会对superType的color产生影响。

    3.传递参数
    借用构造函数的好处是可以向超类型传递参数。

    function superType(name){
      this.name = name;
    }
    
    function subType(){
      superType.call(this,"halo");
      this.age = 11;
    }
    
    var instance = new subType();
    alert(instance.name);//halo
    alert(instance.age);//11
  • 相关阅读:
    POJ 1979 Red and Black
    MyEclipse7.0破解下载
    【android开发】Android防止内存溢出浅析
    数据库索引的作用和长处缺点
    怎样基于android4.4.2的源代码和android-4.3.1_r1的驱动编译I9250的ROM
    Eclipse中SVN的安装步骤(两种)和用法
    又拍云服务评測分享
    Objective-C语法之代码块(block)的使用
    《linux 内核全然剖析》 chapter 2 微型计算机组成结构
    浅谈UML的概念和模型之UML九种图
  • 原文地址:https://www.cnblogs.com/comefuture/p/8305948.html
Copyright © 2011-2022 走看看