繼承:繼承是OO語言(面對對象語言)的一個重要概念摄乒,許多OO語言支持兩種繼承方式:接口繼承和實現(xiàn)繼承悠反。
接口繼承只繼承方法簽名,而實現(xiàn)繼承則繼承實際的方法缺狠。由于函數(shù)沒有簽名问慎,在ECMAScript中無法實現(xiàn)接口繼承,只支持實現(xiàn)繼承挤茄。
并且其實現(xiàn)繼承主要是依靠原型鏈實現(xiàn)的如叼。--JavaScript高級程序設計
繼承概念指的是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類穷劈、父接口)的功能笼恰,并可以增加它自己的新功能的能力踊沸,
繼承是類與類或者接口與接口之間最常見的關系.
知識剖析
繼承方式:
在基于類的面向對象方式中,對象(object)依靠類(class)來產(chǎn)生社证。
而在基于原型的面向對象方式中逼龟,對象(object)則是依靠構造器(constructor)利用原型(prototype)構造出來的。
JavaScript語言正是如此追葡,它是通過一種叫做原型(prototype)的方式來實現(xiàn)面向對象編程腺律。
1.首先我們來看下原型,原型prototype:
JavaScript的每個對象都繼承另一個對象宜肉,后者稱為“原型”(prototype)對象匀钧。只有null除外,它沒有自己的原型對象谬返。
原型對象上的所有屬性和方法之斯,都能被派生對象共享。這就是JavaScript繼承機制的基本設計遣铝。
通過構造函數(shù)生成實例對象時佑刷,會自動為實例對象分配原型對象。每一個構造函數(shù)都有一個prototype屬性酿炸,這個屬性就是實例對象的原型對象瘫絮。
總結一下,原型對象的作用梁沧,就是定義所有實例對象共享的屬性和方法檀何。這也是它被稱為原型對象的含義蝇裤,而實例對象可以視作從原型對象衍生出來的子對象廷支。JS中所有對象都有自己的原型對象。
2.原型鏈
對象的屬性和方法栓辜,有可能是定義在自身恋拍,也有可能是定義在它的原型對象。由于原型本身也是對象藕甩,又有自己的原型施敢,所以形成了一條原型鏈(prototype
chain)。比如狭莱,a對象是b對象的原型僵娃,b對象是c對象的原型,以此類推腋妙。
“原型鏈”的作用是默怨,讀取對象的某個屬性時,JavaScript引擎先尋找對象本身的屬性骤素,如果找不到匙睹,就到它的原型去找愚屁,如果還是找不到,就到原型的原型去找痕檬。如果直到最頂層的Object.prototype還是找不到霎槐,則返回undefined。
3.constructor屬性
prototype對象有一個constructor屬性梦谜,默認指向prototype對象所在的構造函數(shù)丘跌。
由于constructor屬性定義在prototype對象上面,意味著可以被所有實例對象繼承唁桩。
constructor屬性的作用碍岔,是分辨原型對象到底屬于哪個構造函數(shù)。
那么朵夏,訪問對象原型的方法有哪些蔼啦?
獲取實例對象obj的原型對象,有三種方法
1. obj.__proto__
2. obj.constructor.prototype
3. Object.getPrototypeOf(obj)
上面三種方法之中仰猖,前兩種都不是很可靠捏肢。最新的ES6標準規(guī)定,__proto__屬性只有瀏覽器才需要部署饥侵,其他環(huán)境可以不部署鸵赫。而obj.constructor.prototype在手動改變原型對象時,可能會失效躏升。
而除了用原型去繼承之外辩棒,對象之間的"繼承"的還有沒有其他方法呢?
有膨疏,比如構造函數(shù)綁定一睁。
構造函數(shù)綁定也是最簡單的方法,使用call或apply方法佃却,將父對象的構造函數(shù)綁定在子對象上者吁,即在子對象構造函數(shù)中加一行:
functionCat(name,color){
Animal.apply(this,arguments);this.name = name;this.color = color;
}varcat1 =newCat("大毛","黃色");
alert(cat1.species);// 動物
其他繼承方式還有直接繼承prototype、利用空對象作為中介饲帅、 拷貝繼承
這里推薦阮一峰老師的文章复凳,講解了5種關于構造對象的繼承方式:
http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html
。
好了灶泵,文章要講的基本就是這些了育八,感覺觀看。