JS高級和麪向對象

JS中的繼承問題

在JS初期不存在繼承
所謂的繼承是強類型語言中的一種概念,指父類將自身的屬性繼承給子類,子類能夠直接使用繼承來的屬性。
JS之因此不能繼承是由於JS中不存在類的概念
原型是JS中用來實現繼承的方法數組

原型的初識

原型就是 對象.__proto__
原型是對象的一個屬性 叫作__proto__,這個屬性無需開發者本身寫入,每個對象建立出來後,默認就會擁有
原型的特色:原型是一個對象
原型中的屬性會原本來本的繼承給對象
對象可使用原型中的全部屬性,可是原型的屬性不是對象的屬性
每個對象都有其對應的構造函數
對象的原型獲取其構造函數的方法:constructor
構造函數也有一個屬性,這個屬性能夠獲取到構建函數建立出來的對象的原型prototype
構造函數:構造函數中的全部屬性會徹底繼承給對象,這些屬性就是對象自身的屬性
原型:原型中的屬性也會繼承給對象,可是這些屬性不是對象自身的,而是原型的,對象只是可以使用函數

JS中實現繼承的方法

構造函數繼承:靈活,方便,能夠一次性建立多個對象
原型繼承:原型的繼承會將原型中的全部屬性繼承給對象,可是這些屬性值不能靈活的改變
混合式繼承
構造函數和原型共同實現繼承
規則:構造函數繼承常常須要改變值的屬性
原型繼承屬性值不須要改變的屬性性能

原型鏈

JS中原型也是對象,所以也會有__proto__屬性指向本身的原型,這樣在對象的原型,原型和原型的原型之間就會有一個由__proto__
原型鏈的起點:當前的對象
原型的終點:object.prototype (null)
數組對象的原型鏈
數組->Array.prototype-->Object.prototype-->null
函數的原型鏈(函數能夠用 var a = new Function(){}方式聲明)
函數-->Function.prototype-->Object.prototype-->null
Date對象原型鏈
Date對象-->Date.prototype-->Object.prototype-->null
查看Math原型鏈
原型鏈的做用:也是用來實現屬性的繼承的
例如數組對象,各類方法都寫在了原型中,雖然聲明的數組沒有任何屬性方法,可是能夠調用
對象的屬性查找原則
當一個對象調用屬性的時候,會如今當前對象中查找,若是有,就直接使用,若是沒有,就在對象的原型中查找,若是有就使用,若是沒有就繼續向更高一級的原型查找,直到找到Object.prototype,若是有就用,若是尚未,就返回undefined
重點:由屬性查找原則可知,在開發過程當中不要調用對象沒有的屬性,由於會有查找對象的整個原型鏈,很是浪費性能prototype

相關文章
相關標籤/搜索