全面理解JavaScript中的繼承(必看)
JavaScript中我們可以借助原型實現(xiàn)繼承。
例如
function baz(){ this.oo=""; } function foo(){ } foo.prototype=new baz(); var myFoo=new foo(); myFoo.oo;
這樣我們就可以訪問到baz里的屬性oo啦。在實際使用中這個樣不行滴,由于原型的共享特點(數(shù)據(jù)保存在了堆上),
所有實例都使用一個原型,一但baz的屬性有引用類型就悲劇了,一個實例修改了其他實例也都跟著變了...wuwuwu
自然就有了組合式繼承
function baz(){ this.oo=""; } baz.prototype.xx=function(){ } function foo(){ baz.call(this);//第二次調(diào)用 } foo.prototype=new baz();//第一次調(diào)用 var myFoo=new foo(); myFoo.oo; myFoo.xx;
這樣就會有一個問題,代碼里也表明出來了,baz會被調(diào)用兩次,身為處女座的怎么可以允許呢..
插一句,第二種方式就不用出現(xiàn)第一種方式的問題嗎?答案是不會的。
原因是屬性的查找是先從對象自身開始,沒找到才會去原型中去找,call時就把屬性給繼承了。
再插一句,那這樣只使用call繼承不就行了嗎?如果不使用原型這個是可行的,但是作為處女座怎么能不使用原型呢,
在原型上方法是共享的,這樣性能就好了很多呀。
寄生組合式繼承
__extends=function (p,c){ function ctor(){ this.constructor=c;//賦值構(gòu)造函數(shù) } 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;
這樣不但解決了兩次調(diào)用的問題,還解決了對象調(diào)用構(gòu)造函數(shù)時調(diào)用的是真實的創(chuàng)建對象的函數(shù)而不是原型鏈上其他的構(gòu)造函數(shù)。
代碼里有表明。
構(gòu)造函數(shù)是原型對象上的一個屬性,是對象的創(chuàng)建者。由于我們的原型屬性被從新賦值了所以構(gòu)造函數(shù)時繼承來的。
這里要說一下,對象是怎樣創(chuàng)建,也就是new都干了些什么。
例如:
var a=new b();
其實是這樣的,a={};創(chuàng)建了一個給a,然后b.call(a);call里初始化a,在call之前還有一步,就是a的內(nèi)部原型對象
設(shè)置為b的原型屬性指向的原型對象。原型上有構(gòu)造函數(shù)屬性,構(gòu)造函數(shù)用來創(chuàng)建對象分配內(nèi)存控件。
大概就這些...看看時間也不早了,碎吧,保持平和的心態(tài)切勿浮躁,努力去改變明天,希望一切都會慢慢變好。
以上就是小編為大家?guī)淼娜胬斫釰avaScript中的繼承(必看)的全部內(nèi)容了,希望大家多多支持腳步之家。
相關(guān)文章
通過location.replace禁止瀏覽器后退防止重復(fù)提交
如果用戶重復(fù)提交事件,然后又后退,這樣可能會對某些數(shù)據(jù)產(chǎn)生災(zāi)難性的問題。所以今天就向大家介紹一種通過location.replace禁止瀏覽器后退按鈕的方法2014-09-09Element ui tree(樹)實現(xiàn)父節(jié)點選中時子節(jié)點不選中父節(jié)點取消時子節(jié)點自動取消功能
Elementui因為vue在國內(nèi)的影響而受益 使用量巨大樹作為一種重要的開發(fā)組件應(yīng)用廣泛,今天帶大家了解樹的靈活應(yīng)用首先我們來創(chuàng)建一個樹,對Element ui tree父節(jié)點選中時子節(jié)點不選中功能感興趣的朋友跟隨小編一起看看吧2023-07-07解決JS組件bootstrap table分頁實現(xiàn)過程中遇到的問題
這篇文章主要介紹了JS組件bootstrap table分頁實現(xiàn)過程中遇到的問題,感興趣的小伙伴們可以參考一下2016-04-04Locate a File Using a File Open Dialog Box
Locate a File Using a File Open Dialog Box...2007-06-06