7.1原型
【例如】
另外- this指向:
構造函數和原型對象中的this都指向實例化的對象
7.2 constructor屬性
每個原型對象里面都有個constructor屬性( constructor構造函數)
作用:該屬性指向該原型對象的構造函數
使用場景:
如果有多個對象的方法,我們可以給原型對象采取對象形式賦值.
但是這樣就會覆蓋構造函數原型對象原來的內容,這樣修改后的原型對象constructor就不再指向當前構造函數了
此時,我們可以在修改后的原型對象中,添加一個constructor指向原來的構造函數。
【例如】
<script>function Star() {}Star.prototype = {// 手動利用constructor 指回 Star構造函數constructor: Star,sing: function () {console.log('唱歌');},dance: function () {console.log('跳舞');}}console.log(Star.prototype) // 指向 Star
</script>
7.3對象原型
對象都會有一個屬性 __proto__
指向構造函數的prototype原型對象,之所以我們對象可以使用構造函數prototype原型對象的屬性和方法,就是因為對象有 __proto__
原型的存在。
注意:
? __proto__
是JS非標準屬性
? [[prototypel] 和 __proto__
意義相同
? 用來表明當前實例對象指向哪個原型對象prototype
? __proto__
對象原型里面也有一個constructor屬性,指向創建該實例對象的構造函數
?只要是對象,就有原型 __proto__
7.4原型繼承
繼承是面向對象編程的另一個特征,通過繼承進一步提升代碼封裝的程度,JS中大多是借助原型對象實現繼承的特性。
1.封裝-抽取公共部分
把男人和女人公共的部分抽取出來放到人類里面
2.問題和原因
男人和女人都同時使用了同一個對象,根據引用類型的特點,他們指向同一個對象,修改一個就都會受影響
3.解決:
需求:男人和女人不要使用同一個對象,但是不同對象里面包含相同的屬性和方法
因為new每次都會創建一個新的對象,所以用構造函數來處理
7.5原型鏈
基于原型對象的繼承使得不同構造函數的原型對象關聯在一起,并且這種關聯的關系是一種鏈狀的結構,我們將原型對象的鏈狀結構關系稱為原型鏈
記住兩句話:
1.只要是對象,就有原型 __proto__
,指向原型對象
2.只要是原型對象,就有constructor,指向創建該原型對象的構造函數