js繼承

原型鏈繼承

function SubType(){
	this.property = true;
}
SubType.prototype.get = function(){
	return this.property;
}
function SuperType(){
}
SuperType.prototype = new SubType();
var ins = new SuperType();

在這裏插入圖片描述
缺點:

  • 所有子類的實例對引用類型的操作會共享
  • 子類型的原型上的constructor指向的是父類的構造函數
  • 給子類型添加方法必須在替換子類原型後
  • 創建子類型時無法向父類傳參

藉助構造函數繼承

function SubType(){
	this.property = true;
}
SubType.prototype.get = function(){
	return this.property;
}
function SuperType(){
	SuperType.call(this);	
}
var ins = new SuperType();

優點:

  • 可以給父類傳參,並且不會重寫子類的原型。
    缺點
  • 無法繼承原型上的屬性和方法。

組合繼承

function SubType(name){
	this.property = name;
}
SubType.prototype.get = function(){
	return this.property;
}
function SuperType(name){
	SuperType.call(this, name);	//第二次調用父類
}
SuperType.prototype = new SubType(); //第一次調用父類,不用傳參,第二次調用會覆蓋第一次的實力屬性
SuperType.prototype.constructor = SuperType;
var ins = new SuperType("a");

優點:

  • 成功繼承到父類的屬性和方法。
    缺點:
  • 調用兩次父類,

原型式繼承

function object(proto) {
  function F() {}
  F.prototype = proto;
  return new F();
}

const cat = {
  name: 'Lolita',
  friends: ['Yancey', 'Sayaka', 'Mitsuha'],
  say() {
    console.log(this.name);
  },
};

const cat1 = object(cat);

缺點:

  • 導致引用類型被多個實例篡改

寄生式繼承

const cat = {
  name: 'Lolita',
  friends: ['Yancey', 'Sayaka', 'Mitsuha'],
  say() {
    console.log(this.name);
  },
};

function createAnother(original) {
  const clone = Object.create(original); // 獲取源對象的副本

  clone.gender = 'female';

  clone.fly = function() {
    // 增強這個對象
    console.log('I can fly.');
  };

  return clone; // 返回這個對象
}

const cat1 = createAnother(cat);

缺點:

  • 引用類型被篡改,函數無法複用;

寄生組合式繼承

function inheritPrototype(child, parent) {
  const prototype = Object.create(parent.prototype); // 創建父類原型的副本
  prototype.constructor = child; // 將副本的構造函數指向子類
  child.prototype = prototype; // 將該副本賦值給子類的原型
}


function Vehicle(powerSource) {
  this.powerSource = powerSource;
  this.components = ['座椅', '輪子'];
}

Vehicle.prototype.run = function() {
  console.log('running~');
};

function Car(wheelNumber) {
  this.wheelNumber = wheelNumber;
  Vehicle.call(this, '汽油');
}

inheritPrototype(Car, Vehicle);

Car.prototype.playMusic = function() {
  console.log('sing~');
};

只是記錄學習,參考自這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章