關於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的原型屬性指向的原型物件。原型上有建構函式屬性,建構函式用來建立物件分配記憶體控制元件。
大概就這些...看看時間也不早了,碎吧,保持平和的心態切勿浮躁,努力去改變明天,希望一切都會慢慢變好。
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想說說javascript中函式的隱含引數:argumentsarguments該物件代表正在執行的函式和呼叫它的函式的引數。[function.]arguments[n]引數function:選項。當前正在執行的Function物件的名字。n:選項。要傳遞給Function物件的從0開始的引數值...
-
JavaScript經典效果集錦
些很實用且必用的小指令碼程式碼:指令碼1:進入主頁以後自動播放聲音指令碼2:進入主頁後自動最大話,省的去在自己單擊了To(0,0)zeTo(lWidth,lHeight)指令碼3:顯示現在時間的指令碼enow指令碼4:顯示最後修改時間的.指令碼e(Modified)指令碼5:設為首頁,加為收藏,加入頻道,啟動outlook...
-
javascript中的return和閉包函式
複製程式碼程式碼如下:functionmakefunc(x){returnfunction(){returnx;}}alert(makefunc(0));其實不是不執行,只是朋友的意思這裡alert出來的`應該是“0”,而不是function(){returnx;}。不是指令碼寫錯了,只是沒搞懂return,從當前函式退出,並從那個函式返回一個值。如果返...
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想說說javascript中函式的隱含引數:argumentsarguments該物件代表正在執行的函式和呼叫它的函式的引數。[function.]arguments[n]引數function:選項。當前正在執行的Function物件的名字。n:選項。要傳遞給Function物件的從0開始的引數值...