這篇文章主要介紹了javascript框架設(shè)計(jì)之類工廠的相關(guān)資料,非常淺顯易懂,有需要的小伙伴可以查看下。
類與繼承在javascript的出現(xiàn),說明javascript已經(jīng)達(dá)到大規(guī)模開發(fā)的門檻了,在之前是ECMAScript4,就試圖引入類,模塊等東西,但由于過分引入太多的特性,搞得javascript烏煙瘴氣,導(dǎo)致被否決。不過只是把類延時(shí)到ES6.到目前為止,javascript還沒有正真意義上的類。不過我們可以模擬類,曾近一段時(shí)間,類工廠是框架的標(biāo)配,本章會(huì)介紹各種類實(shí)現(xiàn),方便大家在自己的框架中或選擇時(shí)自己喜歡的那一類風(fēng)格。
1.javascript對(duì)類的支持
在其它語言中 ,類的實(shí)例都要通過構(gòu)造函數(shù)new出來。作為一個(gè)刻意模仿java的語言。javascript存在new操作符,并且所有函數(shù)都可以作為構(gòu)造器。構(gòu)造函數(shù)與普通的方法沒有什么區(qū)別。瀏覽器為了構(gòu)建它繁花似錦的生態(tài)圈,比如Node,Element,HTMLElement,HTMLParagraphElement,顯然使用繼承關(guān)系方便一些方法或?qū)傩缘墓蚕恚谑莏avascript從其它語言借鑒了原型這種機(jī)制。Prototype作為一個(gè)特殊的對(duì)象屬性存在于每一個(gè)函數(shù)上。當(dāng)一個(gè)函數(shù)通過new操作符new出其“孩子”——“實(shí)例”,這個(gè)名為實(shí)例的對(duì)象就擁有這個(gè)函數(shù)的Prototype對(duì)象所有的一切成員,從而實(shí)現(xiàn)實(shí)現(xiàn)所有實(shí)例對(duì)象都共享一組方法或?qū)傩浴6鴍avascript所謂的“類”就是通過修改這個(gè)Prototype對(duì)象,以區(qū)別原生對(duì)象及其其它定義的“類”。在瀏覽器中,node這個(gè)類基于Object修改而來的,而Element則是基于Node,而HTMLElement又基于Element....相對(duì)我們的工作業(yè)務(wù),我們可以創(chuàng)建自己的類來實(shí)現(xiàn)重用與共享。
? 1 2 3 4 5 6 7 8 9 10 11 12 function A(){ } A.prototype = { aa:"aa", method:function(){ } }; var a = new A; var b = new A; console.log(a.aa === b.aa); console.log(a.method === b.method)一般地,我們把定義在原型上的方法叫原型方法,它為所有的實(shí)例所共享,這有好也有不好,為了實(shí)現(xiàn)差異化,javascript允許我們直接在構(gòu)造器內(nèi)指定其方法,這叫特權(quán)方法。如果是屬性,就叫特權(quán)屬性。它們每一個(gè)實(shí)例一個(gè)副本,各不影響。因此,我們通常把共享用于操作數(shù)據(jù)的方法放在原型,把私有的屬性放在特權(quán)屬性中。但放于this上,還是讓人任意訪問到,那就放在函數(shù)體內(nèi)的作用域內(nèi)吧。這時(shí)它就成為名副其實(shí)的私有屬性。
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function A() { var count = 0; this.aa = "aa"; this.method = function() { return count; } this.obj = {} } A.prototype = { aa:"aa", method:function(){ } }; var a = new A; var b = new A; console.log(a.aa === b.aa);//true 由于aa的值為基本類型,比較值 console.log(a.obj === b.obj) //false 引用類型,每次進(jìn)入函數(shù)體都要重新創(chuàng)建,因此都不一樣。 console.log(a.method === b.method); //false新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注