大家好,我是IT修真院成都分院第09期學員,一枚正直純潔善良的web程序員。今天給大家分享一下,修真院官網js任務4,原型鏈和訪問對象原型的方法?
1.背景介紹
JavaScript 中,萬物皆對象。 JavaScript根據"原型鏈"(prototype chain)模式,來實現繼承。
二.知識剖析
1.? 對象:
JavaScript中,對象是有區別的,分為普通對象和函數對象。
o1 o2 o3 為普通對象,f1 f2 f3 為函數對象。
2.? 對象繼承
Brendan Eich參考C++和Java,做了簡化設計,將new命令引入JavaScript中,new后面跟對象的構造函數,用來創建對象。這樣做有個缺點:無法共享方法和屬性.。
Brendan Eich決定為構造函數設置一個prototype屬性。這個屬性包含一個對象,所有實例對象需要共享的屬性和方法,都放在這個對象里面;
那些不需要共享的屬性和方法,就放在構造函數里面。
實例對象一旦創建,將自動引用prototype的屬性和方法。也就是說,實例對象的屬性和方法,分成兩種,一種是本地的,另一種是引用的。
species屬性放在prototype對象里,是兩個實例對象共享的。只要修改了prototype對象,就會同時影響到兩個實例對象
DOG.prototype.species = '貓科';
console.log(dogA.species); // 貓科
console.log(dogB.species); // 貓科
由于所有的實例對象共享同一個prototype對象,那么從外界看起來,prototype對象就好像是實例對象的原型,而實例對象則好像"繼承"了prototype對象一樣。
3.? 原型prototype
在JavaScript 中,每當定義一個對象(函數)時候,對象中都會包含一些預定義的屬性。其中函數對象的一個屬性就是原型對象 prototype。普通對象沒有prototype,但有_ proto _屬性。
4.??原型鏈
JS在創建對象(不論是普通對象還是函數對象)的時候,都有一個叫做__proto__的內置屬性,用于指向創建它的函數對象的原型對象prototype。
5.??constructor屬性
prototype對象有一個constructor屬性,默認指向prototype對象所在的構造函數。
由于constructor屬性定義在prototype對象上面,意味著可以被所有實例對象繼承。
constructor屬性的作用,是分辨原型對象到底屬于哪個構造函數。
6.??總結
1.原型和原型鏈是JS實現繼承的一種模型。
2.原型鏈的形成是真正是靠__proto__ 而非prototype。
三.常見問題
訪問對象原型的方法有哪些?
四.解決方案
獲取實例對象obj的原型對象,有三種方法
1. obj.__proto__
2. obj.constructor.prototype
3. Object.getPrototypeOf(obj)
五.編碼實戰
六.擴展思考
1.Object.__proto__ === Function.prototype // true
2.Function.__proto__ === Function.prototype // true?
3.Function.prototype.__proto__=== Object.prototype //true
1.Object是函數對象,是通過new Function()創建,所以Object.__proto__指向Function.prototype。
2.Function 也是對象函數,也是通過new Function()創建,所以Function.__proto__指向Function.prototype。
3.Function.prototype是個函數對象,理論上其__proto__應該指向 Function.prototype,就是它自己,自己指向自己,沒有意義。函數對象也是對象,給它設定根指向Object.prototype,Object.prototype.__proto__=== null,保證原型鏈能夠正常結束。
7.參考文獻
8.更多討論
鳴謝
感謝 王蒙師兄,此教程是在他們之前技術分享的基礎上完善而成
感謝大家觀看
騰訊視頻:
今天的分享就到這里啦,歡迎大家點贊、轉發、留言、拍磚~
我們下周再見!
------------------------------------------------------------------------------------------------------------------------
技能樹.IT修真院
“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫”。
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。快來與我一起學習吧~