這篇文章主要介紹了javascript框架設計之類工廠的相關資料,非常淺顯易懂,有需要的小伙伴可以查看下。
類與繼承在javascript的出現,說明javascript已經達到大規模開發的門檻了,在之前是ECMAScript4,就試圖引入類,模塊等東西,但由于過分引入太多的特性,搞得javascript烏煙瘴氣,導致被否決。不過只是把類延時到ES6.到目前為止,javascript還沒有正真意義上的類。不過我們可以模擬類,曾近一段時間,類工廠是框架的標配,本章會介紹各種類實現,方便大家在自己的框架中或選擇時自己喜歡的那一類風格。
1.javascript對類的支持
在其它語言中 ,類的實例都要通過構造函數new出來。作為一個刻意模仿java的語言。javascript存在new操作符,并且所有函數都可以作為構造器。構造函數與普通的方法沒有什么區別。瀏覽器為了構建它繁花似錦的生態圈,比如Node,Element,HTMLElement,HTMLParagraphElement,顯然使用繼承關系方便一些方法或屬性的共享,于是javascript從其它語言借鑒了原型這種機制。Prototype作為一個特殊的對象屬性存在于每一個函數上。當一個函數通過new操作符new出其“孩子”——“實例”,這個名為實例的對象就擁有這個函數的Prototype對象所有的一切成員,從而實現實現所有實例對象都共享一組方法或屬性。而javascript所謂的“類”就是通過修改這個Prototype對象,以區別原生對象及其其它定義的“類”。在瀏覽器中,node這個類基于Object修改而來的,而Element則是基于Node,而HTMLElement又基于Element....相對我們的工作業務,我們可以創建自己的類來實現重用與共享。
? 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)一般地,我們把定義在原型上的方法叫原型方法,它為所有的實例所共享,這有好也有不好,為了實現差異化,javascript允許我們直接在構造器內指定其方法,這叫特權方法。如果是屬性,就叫特權屬性。它們每一個實例一個副本,各不影響。因此,我們通常把共享用于操作數據的方法放在原型,把私有的屬性放在特權屬性中。但放于this上,還是讓人任意訪問到,那就放在函數體內的作用域內吧。這時它就成為名副其實的私有屬性。
? 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 引用類型,每次進入函數體都要重新創建,因此都不一樣。 console.log(a.method === b.method); //false新聞熱點
疑難解答