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