Javascript的繼承

引用infoQ的一片文章《JavaScript的實例化與繼承:請中止使用new關鍵字》一段話:javascript

"

傳統的實例化與繼承

假設咱們有兩個類,Class:function Class() {}SubClass:function SubClass(){},SubClass須要繼承自Class。傳統方法通常是按以下步驟來組織和實現的:java

  • Class中被繼承的屬性和方法必須放在Class的prototype屬性中this

  • SubClass中本身的方法和屬性也必須放在本身prototype屬性中
  • SubClass的prototype對象的prototype(__proto__)屬性必須指向的Class的prototypespa

"

Class中被繼承的屬性和方法必須放在Class的prototype屬性中prototype

// 聲明一個class
function Class() {}

// 給class的prototype添加一個類方法method1
Class.prototype.method1 = function() {
  console.log('class method1 called!');
}

// 建立實例
var instance = new Class();
// 調用類方法
instance.method1();

上面的Class既聲明爲一個類, 而且給Class添加兩個類方法,類方法也是一個Function,但不能經過Class.prototype.method的方式直接調用,可是能夠經過Class.prototype.method.call的方式調用或者實例調用。code

 

SubClass中本身的方法和屬性也必須放在本身prototype屬性中對象

SubClass 也是同樣經過prototype來添加本身的類方法blog

 

SubClass的prototype對象的prototype(__proto__)屬性必須指向的Class的prototype繼承

 

function Class() {}

Class.prototype.print = function(s) {
  console.log('class print>' + s);
}

function SubClass() {
Class.call(this);
}
// 經過Object.create來實現繼承 SubClass.prototype = Object.create(Class.prototype) SubClass.prototype.add = function(a, b) { return (a+b); }

// SubClass添加類成員變量
SubClass.prototype.name = 'abc';
// 建立subclass實例 var b = new SubClass();
// 調用subclass類方法 var r = b.add(1, 20);
// 調用父類Class的方法 b.print(r);

 

 

理解prototype鏈對實現繼承很關鍵:ip

當實例b調用print方法時,先查找實例b(Object)有沒有這樣的function成員, 若是有則調用,沒有則在SubClass的prototype(Object) 中查找,若是沒有則在prototype.prototype(Object)中查找,順着prototype鏈一直到找到爲止,找不到就會報錯。

 

上面的示例代碼是實現繼承的基本原理。

相關文章
相關標籤/搜索