對建構函式與原型的一點理解
對建構函式的理解
建立物件的方式:
1.物件字面量
2.new Object()
3.自定義建構函式
ES6以前沒有類的概念,使用建構函式建立物件
建構函式是一種特殊的函式,主要用來初始化物件,即為物件成員變數賦初始值,它總與new一起使用。我們可以把物件中公共的屬性和方法抽取出來,然後封裝到這個函式裡面
注意:
1.建構函式用於建立某一類物件,其首字母要大寫
2.建構函式要和new一起使用才有意義
new執行時做的四件事:
1.在記憶體中建立一個新的空物件
2.讓this指向這個新的物件
3.執行建構函式裡面的程式碼,給這個新物件新增屬性和方法
4.返回這個新物件(所以建構函式裡不需要return)
例項成員,通過例項訪問
靜態成員,通過建構函式訪問
對原型的理解,(用原型實現繼承,手寫)
原型是建構函式裡的一個屬性,屬性名為prototype,這個prototype是一個物件
通過建構函式例項化得到的物件,物件身上系統自動加了一個
__proto__
屬性,這個屬性指向建構函式的原型物件,也就是prototype屬性
呼叫方法時,先看物件自己有沒有這個方法,沒有的話就去原型上找
prototype上又有一個constructor屬性,指回建構函式本身
constructor主要用於記錄該物件引用於哪個建構函式,它可以讓原型物件重新指向原來的建構函式。
如果我們用物件給建構函式的prototype賦值,則必須手動寫上constructor指向原來的建構函式
建構函式方法很好用,但是存在浪費記憶體的問題
建構函式通過原型分配的函式是所有物件所共享的
js規定,每一個建構函式都有一個prototype屬性,指向另一個物件。注意prototype就是一個物件,這個物件的所有屬性和方法,都會被建構函式所擁有
我們可以把那些不變的方法,直接定義在prototype物件上,這樣所有物件的例項就可以共享這些方法
通過一個物件的_proto_可以找到它的原型物件,原型物件也是一個物件,可以通過原型物件的_proto_,最後找到Object.prototype。這個從例項的原型物件開始一直到Object.prototype就是原型鏈。
l 原型鏈繼承
核心:將父類的例項作為子類的原型
優點:
-
非常純粹的繼承關係,例項是子類的例項,也是父類的例項
-
父類新增原型方法/原型屬性,子類都能訪問到
-
簡單,易於實現
缺點:
- 要想為子類新增屬性和方法,必須在new Father()這樣的語句之後執行,不能放到構造器中
- 無法實現多繼承
- 來自原型物件的所偶遇屬性被例項共享
- 建立子類例項時,無法向父類構造器傳參
原型鏈頂端是什麼
null