Js是一門弱類型語言php
Java、c、c++、c#、php都是強類型語言c++
在強類型語言中有一個‘類’的概念,是用來實現繼承的。編程
強類型語言:三種特性c#
1. 多態性:在強類型語言中,一個變量存在多種形態。在不一樣的上下文代碼中,變量的形式能夠不一樣(瞭解)函數
2. 繼承性:在強類型語言中,會存在類的概念,類有父級和子級關係(相似於js中的函數),子級類能夠徹底繼承父級類中的全部屬性prototype
(1) 繼承就是完徹底全擁有對象
3. 封裝:封裝函數繼承
Js在誕生初期沒有繼承 由於js中沒有類原型
後來人們就建立出了面向對象編程面向對象編程
1. js中的繼承
(1) 原型
① 原型是基於對象出現的
② 定義:原型就是某一個對象中__proto__非標準屬性指向的一個對象
③ __proto__非標準屬性 是每個對象中的默認屬性,不須要手動編寫,自動就會有這個屬性,這個屬性的屬性值就是這個對象的原型
④ 原型:其實也是一個對象,也會有各類屬性,這些屬性,會徹底繼承給原型的對象
⑤ 對象.__proto__就是當前對象的原型
(2) 對象的聲明方式
① new關鍵字聲明
② 字面量聲明
③ 由以上兩種方法可知
1) Js中聲明對象能夠直接聲明,也能夠經過構造函數來聲明
2) 這裏,咱們主要探討一下經過構造函數聲明對象
(3) 構造函數
① 構造函數能夠實例化對象,這個實例化的對象有原型
② 實例化的對象原型也是 對象名.__proto__
③ 對象名.__proto__(原型)和構造函數之間的關係:
1) 原型中會有一個屬性constructor,這個屬性的屬性值就是對象的構造函數
a. 原型.constructor===構造函數
b. 構造函數.prototype===原型
構造函數中最後會隱式返回綁定好屬性的空對象,若是用戶沒有寫返回值或者返回值是值類型數據,那麼,構造函數就會隱式返回。
若是用戶寫了返回值爲引用類型,構造函數就不會隱式返回,而是返回用戶寫入的返回值
1. 直接建立對象
(1) 優勢:簡單,明瞭
(2) 缺點:當須要建立大量對象的時候,會形成大量的工做量=-=
2. 構造函數建立對象
(1) 優勢:能夠很方便的建立大量對象
(2) 缺點:一旦忘記寫new就會形成全局變量的污染
3. 工廠函數建立對象
(1) 優勢:能夠大量建立對象,而且既能夠寫new,也能夠不寫new
(2) 缺點:作法比較複雜
如今咱們建立對象通常使用構造函數,由於構造函數建立出來的對象類型是最強的
1. 構造函數繼承
2. 原型繼承
3. 混合式繼承: 混合式繼承 父親和母親一塊兒給孩子實現繼承 。母親構造函數實現的繼承很靈活,屬性的值能夠根據用戶傳遞的實參隨時改變,所以,通常把一些值可能互不相同的屬性寫在構造函數中實現繼承。
父親原型 實現的繼承就很固定。通常不能改變,所以咱們會把一些值不變的屬性放在原型中實現繼承