JS篇 - js的繼承

定義

漢語解釋:泛指把前人的做風、文化、知識等接受過來
計算機術語解釋:繼承可使得子類具備父類的屬性和方法或者從新定義、追加屬性和方法等函數

先來個父類祭天

function Animal(name) {
    this.name = name || 'animal';
    this.speak = function () {
      console.log('speak');
    }
  }
  Animal.prototype.move = function () {
    console.log('move');
  }

原型鏈繼承

function Cat() {
    this.getName = function () {
      console.log(this.name);
    };
  }

  Cat.prototype = new Animal('cat1');
  var cat = new Cat();
  cat.name = 'cat2';
  console.log(cat);//該實例對象有一個name爲cat2,原型上有一個name是cat1
  cat.getName();//cat2(先找當前屬性,再找原型)
  console.log(cat instanceof Cat);//true
  console.log(cat instanceof Animal);//true
父子之間存在關係,但子類並不會建立新的屬性,set子類屬性並不會覆蓋原型上的屬性,get屬性只不過是根據先讀取當前屬性再讀取原型的優先級

構造函數繼承

function Dog(name) {
    Animal.call(this);
    this.name = name || 'doggy';
  }

  var dog = new Dog();
  console.log(dog);//只有子類屬性
  console.log(dog instanceof Dog); // true
  console.log(dog instanceof Animal); // false
實際上只是利用父類構造函數來添加子類屬性,父子之間沒有什麼關係

ES6繼承(完美繼承)

class Animal2 {
    constructor(name) {
      this.name = name || 'animal2';
      this.speak = function () {
        console.log('speak');
      }
    }
  }

  Animal2.prototype.move = function () {
    console.log('move');
  }
  var animal2 = new Animal2('god2');
  console.log(animal2);

  class Bird extends Animal2 {
    getName() {
      console.log(this.name);
    }
  }

  var bird = new Bird('bird');
  console.log(bird);//既有父類的屬性,原型鏈也指向父類
  bird.getName();
  console.log(bird instanceof Bird); // true
  console.log(bird instanceof Animal2); // true
相關文章
相關標籤/搜索