- 相關(guān)推薦
關(guān)于JavaScript中繼承的深入理解
JavaScript中我們可以借助原型實(shí)現繼承。
例如
function baz(){this.oo="";}function foo(){}foo.prototype=new baz();var myFoo=new foo();myFoo.oo;
這樣我們就可以訪(fǎng)問(wèn)到baz里的屬性oo啦。在實(shí)際使用中這個(gè)樣不行滴,由于原型的共享特點(diǎn)(數據保存在了堆上),
所有實(shí)例都使用一個(gè)原型,一但baz的屬性有引用類(lèi)型就悲劇了,一個(gè)實(shí)例修改了其他實(shí)例也都跟著(zhù)變了...wuwuwu
自然就有了組合式繼承
function baz(){this.oo="";}baz.prototype.xx=function(){}function foo(){baz.call(this);//第二次調用}foo.prototype=new baz();//第一次調用var myFoo=new foo();myFoo.oo;myFoo.xx;
這樣就會(huì )有一個(gè)問(wèn)題,代碼里也表明出來(lái)了,baz會(huì )被調用兩次,身為處女座的怎么可以允許呢..
插一句,第二種方式就不用出現第一種方式的問(wèn)題嗎?答案是不會(huì )的。
原因是屬性的查找是先從對象自身開(kāi)始,沒(méi)找到才會(huì )去原型中去找,call時(shí)就把屬性給繼承了。
再插一句,那這樣只使用call繼承不就行了嗎?如果不使用原型這個(gè)是可行的,但是作為處女座怎么能不使用原型呢,
在原型上方法是共享的,這樣性能就好了很多呀。
寄生組合式繼承
__extends=function (p,c){function ctor(){this.constructor=c;//賦值構造函數}ctor.prototype=p.prototype;c.prototype=new ctor();}function baz(){this.oo=[1];}baz.prototype.xx=function(){}__extends(baz,foo);function foo(){baz.call(this);}var myFoo=new foo();myFoo.oo;myFoo.xx;
這樣不但解決了兩次調用的問(wèn)題,還解決了對象調用構造函數時(shí)調用的是真實(shí)的創(chuàng )建對象的函數而不是原型鏈上其他的構造函數。
代碼里有表明。
構造函數是原型對象上的一個(gè)屬性,是對象的創(chuàng )建者。由于我們的原型屬性被從新賦值了所以構造函數時(shí)繼承來(lái)的。
這里要說(shuō)一下,對象是怎樣創(chuàng )建,也就是new都干了些什么。
例如:
var a=new b();
其實(shí)是這樣的,a={};創(chuàng )建了一個(gè)給a,然后b.call(a);call里初始化a,在call之前還有一步,就是a的內部原型對象
設置為b的原型屬性指向的原型對象。原型上有構造函數屬性,構造函數用來(lái)創(chuàng )建對象分配內存控件。
大概就這些...看看時(shí)間也不早了,碎吧,保持平和的心態(tài)切勿浮躁,努力去改變明天,希望一切都會(huì )慢慢變好。
【JavaScript中繼承的深入理解】相關(guān)文章:
有關(guān)深入理解JavaScript中的并行處理的介紹10-14
對javascript的理解08-08
淺談javascript中的單線(xiàn)程理解08-16
淺談如何深入學(xué)習Javascript中的this關(guān)鍵字08-19
理解JavaScript原型鏈教程09-02
javascript的閉包概念怎么理解06-15
JavaScript中的with關(guān)鍵字07-24
在Java中執行JavaScript代碼07-14