zoukankan      html  css  js  c++  java
  • 读javascript高级程序设计06-面向对象之继承

    原型链是实现继承的主要方法,通过原型能让一个引用类型继承另一个引用类型。

    1.原型链实现继承

    function SuperType(){
    this.superprop=1;
    }
    SuperType.prototype={
      showSuperprop:function(){
      console.log(this.superprop);
      }
    }
    function SubType(){
    this.subprop=2;
    }
    SubType.prototype=new SuperType();
    SubType.prototype.showSubprop=function(){
      console.log(this.subprop);
    }
    var s=new SuperType();
    s.showSuperprop();//1
    var s2=new SubType();
    s2.showSuperprop();//1
    s2.showSubprop();//2

    注意:在使用原型链实现继承时,不能用对象字面量方法创建原型方法。

    2.借用构造函数

    在子类型构造函数内部调用超类型的构造函数。

    function SuperType(){
    this.numbers=[1,2,3];
    }
    function SubType(){
    SuperType.apply(this);
    }
    var s=new SubType();
    s.numbers.push(4);
    console.log(s.numbers);//1,2,3,4
    var s1=new SubType();
    console.log(s1.numbers);//1,2,3

    * 3.组合继承--原型链结合借用构造函数

    使用原型链实现对原型对象属性和方法的继承,使用构造函数实现对实例对象属性的继承。

    function Person(name){
      this.name=name;
      this.numbers=[1,2,3];
    }
    Person.prototype.sayName=function(){
      console.log(this.name);
    }
    function Student(name,age){
      Person.call(this,name);////第二次调用Person()
      this.age=age;
    }
    Student.prototype=new Person();//第一次调用Person()
    Student.prototype.sayAge=function(){
      console.log(this.age);
    }
    var s=new Student('小张',15);
    s.sayName();//小张
    s.sayAge();//15
    s.numbers.push(5);
    console.log(s.numbers);//[1, 2, 3, 5]
    var s1=new Student('小兰',14);
    s1.sayName();//小兰
    s1.sayAge();//14
    console.log(s1.numbers);//[1, 2, 3]

    组合继承是很常用的继承方式,但是它也有个缺点,就是需要调用两次超类型的构造函数。

    *4.寄生式组合式继承

    寄生组合式继承:借用构造函数继承属性,使用原型链的混合型式继承方法。寄生组合式是实现继承的最佳方式。

    function object(o) {
      function F() {
      }
      F.prototype = o;
      return new F();
    }
    function inheritPrototype(superType, subType) {
      var prototype = object(superType.prototype);
      prototype.constructor = subType;
      subType.prototype = prototype;
    }
    function superType(name) {
      this.name = name;
    }
    superType.prototype.sayName = function () {
      console.log('my name is ' + this.name);
    }
    function subType(name, age) {
      superType.call(this, name);
      this.age = age;
    }
    inheritPrototype(superType, subType);
    subType.prototype.sayAge = function () {
      console.log('my age is ' + this.age);
    }
    var s=new superType('Cathy');
    s.sayName();//my name is Cathy
    var s1 = new subType('Tom', 18);
    s1.sayName();//my name is Tom
    s1.sayAge();//my age is 18
  • 相关阅读:
    计算机基础数据结构讲解第九篇-顺序队列
    计算机基础数据结构讲解第八篇-栈
    计算机基础数据结构讲解第七篇-链表操作
    计算机基础数据结构讲解第六篇-顺序表操作
    计算机基础数据结构讲解第五篇-顺序表
    计算机基础数据结构讲解第三篇-B树和B+树
    计算机基础数据结构讲解第二篇-散列查找
    MLHPC 2018 | Aluminum: An Asynchronous, GPU-Aware Communication Library Optimized for Large-Scale Training of Deep Neural Networks on HPC Systems
    MXNet源码分析 | KVStore进程间通信
    链表类问题
  • 原文地址:https://www.cnblogs.com/janes/p/3858668.html
Copyright © 2011-2022 走看看