摘要:私有變量函數(shù)在具體說(shuō)前說(shuō)幾個(gè)相關(guān)的東東,可以更好的理解的設(shè)計(jì)意圖。
JavaScript prototype
每個(gè)函數(shù)都有一個(gè)prototype屬性,這個(gè)屬性是指向一個(gè)對(duì)象的引用,這個(gè)對(duì)象稱(chēng)為原型對(duì)象,原型對(duì)象包含函數(shù)實(shí)例共享的方法和屬性,也就是說(shuō)將函數(shù)用作構(gòu)造函數(shù)調(diào)用(使用new操作符調(diào)用)的時(shí)候,新創(chuàng)建的對(duì)象會(huì)從原型對(duì)象上繼承屬性和方法。
私有變量、函數(shù)在具體說(shuō)prototype前說(shuō)幾個(gè)相關(guān)的東東,可以更好的理解prototype的設(shè)計(jì)意圖。之前寫(xiě)的一篇JavaScript 命名空間博客提到過(guò)JavaScript的函數(shù)作用域,在函數(shù)內(nèi)定義的變量和函數(shù)如果不對(duì)外提供接口,那么外部將無(wú)法訪問(wèn)到,也就是變?yōu)樗接凶兞亢退接泻瘮?shù)。
function Obj(){ var a=0; //私有變量 var fn=function(){ //私有函數(shù) } }
這樣在函數(shù)對(duì)象Obj外部無(wú)法訪問(wèn)變量a和函數(shù)fn,它們就變成私有的,只能在Obj內(nèi)部使用,即使是函數(shù)Obj的實(shí)例仍然無(wú)法訪問(wèn)這些變量和函數(shù)
var o=new Obj(); console.log(o.a); //undefined console.log(o.fn); //undefined靜態(tài)變量、函數(shù)
當(dāng)定義一個(gè)函數(shù)后通過(guò) “.”為其添加的屬性和函數(shù),通過(guò)對(duì)象本身仍然可以訪問(wèn)得到,但是其實(shí)例卻訪問(wèn)不到,這樣的變量和函數(shù)分別被稱(chēng)為靜態(tài)變量和靜態(tài)函數(shù),用過(guò)Java、C#的同學(xué)很好理解靜態(tài)的含義。
function Obj(){ } Obj.a=0; //靜態(tài)變量 Obj.fn=function(){ //靜態(tài)函數(shù) } console.log(Obj.a); //0 console.log(typeof Obj.fn); //function var o=new Obj(); console.log(o.a); //undefined console.log(typeof o.fn); //undefined實(shí)例變量、函數(shù)
在面向?qū)ο缶幊讨谐艘恍?kù)函數(shù)我們還是希望在對(duì)象定義的時(shí)候同時(shí)定義一些屬性和方法,實(shí)例化后可以訪問(wèn),JavaScript也能做到這樣
function Obj(){ this.a=[]; //實(shí)例變量 this.fn=function(){ //實(shí)例方法 } } console.log(typeof Obj.a); //undefined console.log(typeof Obj.fn); //undefined var o=new Obj(); console.log(typeof o.a); //object console.log(typeof o.fn); //function
這樣可以達(dá)到上述目的,然而
function Obj(){ this.a=[]; //實(shí)例變量 this.fn=function(){ //實(shí)例方法 } } var o1=new Obj(); o1.a.push(1); o1.fn={}; console.log(o1.a); //[1] console.log(typeof o1.fn); //object var o2=new Obj(); console.log(o2.a); //[] console.log(typeof o2.fn); //function
上面的代碼運(yùn)行結(jié)果完全符合預(yù)期,但同時(shí)也說(shuō)明一個(gè)問(wèn)題,在o1中修改了a和fn,而在o2中沒(méi)有改變,由于數(shù)組和函數(shù)都是對(duì)象,是引用類(lèi)型,這就說(shuō)明o1中的屬性和方法與o2中的屬性與方法雖然同名但卻不是一個(gè)引用,而是對(duì)Obj對(duì)象定義的屬性和方法的一個(gè)復(fù)制。
這個(gè)對(duì)屬性來(lái)說(shuō)沒(méi)有什么問(wèn)題,但是對(duì)于方法來(lái)說(shuō)問(wèn)題就很大了,因?yàn)榉椒ǘ际窃谧鐾耆粯拥墓δ埽菂s又兩份復(fù)制,如果一個(gè)函數(shù)對(duì)象有上千和實(shí)例方法,那么它的每個(gè)實(shí)例都要保持一份上千個(gè)方法的復(fù)制,這顯然是不科學(xué)的,這可腫么辦呢,prototype應(yīng)運(yùn)而生。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86235.html
摘要:如果要理解基于原型實(shí)現(xiàn)面向?qū)ο蟮乃枷?,那么理解中得三個(gè)重要概念構(gòu)造函數(shù)原型原型鏈對(duì)幫助理解基于原型的面向?qū)ο笏枷刖惋@得尤為重要。函數(shù)對(duì)象的原型在中,函數(shù)是一種特殊的對(duì)象,所有的函數(shù)都是構(gòu)造函數(shù)的實(shí)例。 介紹 和java這種基于類(lèi)(class-base)的面向?qū)ο蟮木幊陶Z(yǔ)言不同,javascript沒(méi)有類(lèi)這樣的概念,但是javascript也是面向?qū)ο蟮恼Z(yǔ)言,這種面向?qū)ο蟮姆绞匠蔀?基...
摘要:基于原型的繼承誠(chéng)惶誠(chéng)恐的寫(xiě)下這篇文章。無(wú)論是還是,都是面向?qū)ο蟮?。將這個(gè)新對(duì)象作為構(gòu)造函數(shù)的執(zhí)行上下文其指向這個(gè)對(duì)象,并執(zhí)行構(gòu)造函數(shù)返回這個(gè)對(duì)象原型繼承我們來(lái)定義一個(gè)簡(jiǎn)單的類(lèi)和它的原型我們?cè)谠蜕隙x了一個(gè)方法。 源碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/JavaScr...
摘要:如下所示在規(guī)范中,已經(jīng)正式把屬性添加到規(guī)范中也可以通過(guò)設(shè)置和獲取對(duì)象的原型對(duì)象對(duì)象之間的關(guān)系可以用下圖來(lái)表示但規(guī)范主要介紹了如何利用構(gòu)造函數(shù)去構(gòu)建原型關(guān)系。 前言 在軟件工程中,代碼重用的模式極為重要,因?yàn)樗麄兛梢燥@著地減少軟件開(kāi)發(fā)的成本。在那些主流的基于類(lèi)的語(yǔ)言(比如Java,C++)中都是通過(guò)繼承(extend)來(lái)實(shí)現(xiàn)代碼復(fù)用,同時(shí)類(lèi)繼承引入了一套類(lèi)型規(guī)范。而JavaScript是...
摘要:由于一般所有的原型鏈最終都會(huì)指向頂端的,所以它們都是的。好了現(xiàn)在了,成了所有對(duì)象原型鏈的。 JavaScript里任何東西都是對(duì)象,任何一個(gè)對(duì)象內(nèi)部都有另一個(gè)對(duì)象叫__proto__,即原型,它可以包含任何東西讓對(duì)象繼承。當(dāng)然__proto__本身也是一個(gè)對(duì)象,它自己也有自己的__proto__,這樣一級(jí)一級(jí)向上,就構(gòu)成了一個(gè)__proto__鏈,即原型鏈。當(dāng)然原型鏈不會(huì)無(wú)限向上,它有...
摘要:深入理解原型與繼承看過(guò)不少書(shū)籍,不少文章,對(duì)于原型與繼承的說(shuō)明基本上讓人不明覺(jué)厲,特別是對(duì)于習(xí)慣了面向?qū)ο缶幊痰娜藖?lái)說(shuō)更難理解,這里我就給大家說(shuō)說(shuō)我的理解。 深入理解:JavaScript原型與繼承 看過(guò)不少書(shū)籍,不少文章,對(duì)于原型與繼承的說(shuō)明基本上讓人不明覺(jué)厲,特別是對(duì)于習(xí)慣了面向?qū)ο缶幊痰娜藖?lái)說(shuō)更難理解,這里我就給大家說(shuō)說(shuō)我的理解。 首先JavaScript是一門(mén)基于原型編程的語(yǔ)言...
摘要:于是退而求其次叫為類(lèi)的構(gòu)造函數(shù)。如果這個(gè)函數(shù)被用在創(chuàng)建自定義對(duì)象的場(chǎng)景中,我們稱(chēng)這個(gè)函數(shù)為構(gòu)造函數(shù)。遇到的問(wèn)題始終指向創(chuàng)建當(dāng)前對(duì)象的構(gòu)造函數(shù)。 Object.constructor,prototype 對(duì)象的prototype和constructor是兩個(gè)重要的屬性,他們總是成對(duì)出現(xiàn),提到constructor的地方,不得不涉及到另外一個(gè)非常重要的屬性prototype,它是js中基于...
閱讀 2720·2021-11-11 16:54
閱讀 2343·2021-10-09 09:44
閱讀 2568·2019-08-30 15:54
閱讀 1948·2019-08-30 11:24
閱讀 1189·2019-08-29 17:03
閱讀 2116·2019-08-29 16:22
閱讀 2098·2019-08-29 13:11
閱讀 1057·2019-08-29 12:14