關於JavaScript中繼承的深入理解

才智咖 人氣:1.2W

JavaScript中我們可以藉助原型實現繼承。

關於JavaScript中繼承的深入理解

例如

function baz(){="";}function foo(){}otype=new baz();var myFoo=new foo();;

這樣我們就可以訪問到baz裡的屬性oo啦。在實際使用中這個樣不行滴,由於原型的共享特點(資料儲存在了堆上),

所有例項都使用一個原型,一但baz的屬性有引用型別就悲劇了,一個例項修改了其他例項也都跟著變了wu

自然就有了組合式繼承

function baz(){="";}=function(){}function foo(){(this);//第二次呼叫}otype=new baz();//第一次呼叫var myFoo=new foo();;;

這樣就會有一個問題,程式碼裡也表明出來了,baz會被呼叫兩次,身為處女座的怎麼可以允許呢..

插一句,第二種方式就不用出現第一種方式的問題嗎?答案是不會的。

原因是屬性的查詢是先從物件自身開始,沒找到才會去原型中去找,call時就把屬性給繼承了。

再插一句,那這樣只使用call繼承不就行了嗎?如果不使用原型這個是可行的,但是作為處女座怎麼能不使用原型呢,

在原型上方法是共享的,這樣效能就好了很多呀。

寄生組合式繼承

__extends=function (p,c){function ctor(){tructor=c;//賦值建構函式}otype=otype;otype=new ctor();}function baz(){=[1];}=function(){}__extends(baz,foo);function foo(){(this);}var myFoo=new foo();;;

這樣不但解決了兩次呼叫的問題,還解決了物件呼叫建構函式時呼叫的是真實的建立物件的函式而不是原型鏈上其他的建構函式。

程式碼裡有表明。

建構函式是原型物件上的`一個屬性,是物件的建立者。由於我們的原型屬性被從新賦值了所以建構函式時繼承來的。

這裡要說一下,物件是怎樣建立,也就是new都幹了些什麼。

例如:

var a=new b();

其實是這樣的,a={};建立了一個給a,然後(a);call裡初始化a,在call之前還有一步,就是a的內部原型物件

設定為b的原型屬性指向的原型物件。原型上有建構函式屬性,建構函式用來建立物件分配記憶體控制元件。

大概就這些...看看時間也不早了,碎吧,保持平和的心態切勿浮躁,努力去改變明天,希望一切都會慢慢變好。

TAGS:繼承