引用infoQ的一片文章《JavaScript的實例化與繼承:請中止使用new關鍵字》一段話:javascript
假設咱們有兩個類,Class:function Class() {}
和SubClass:function SubClass(){}
,SubClass須要繼承自Class。傳統方法通常是按以下步驟來組織和實現的:java
Class中被繼承的屬性和方法必須放在Class的prototype屬性中this
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鏈一直到找到爲止,找不到就會報錯。
上面的示例代碼是實現繼承的基本原理。