【新東網技術大咖帶您走進JavaScript】微軟為什么會三次敗給JavaScript
發布時間: 2016-09-02 10:57:31
文/王龍翔 通信研發部
新東網自2001年成立以來,掌握大數據、云計算、通信、物聯網及區塊鏈等領先信息技術,擁有一支逾16年經驗的強大IT團隊。為沉淀企業技術實力,繼續發揮行業優勢,《東網快訊》特邀新東網技術大咖帶您走進這些先進信息技術,揭秘新東網16年來的技術成果,每周五發布。
在開始我們的話題之前,我們首先來認識一下JavaScript。
1、 JavaScript是門腳本語言,同時也是一門具有面向對象特性的編程,語法擴展特性很靈活的設計語言。
2、 JavaScript有委托,有事件,有異常處理,對象模型也很豐富。雖然不能繼承,不過對象都可以無限擴展,有無繼承也沒那么多的意義了。
3、 瀏覽器市場競爭日趨白熱化,不管是IE9,FireFox X還是Chrome X,競爭的焦點都是速度,速度的核心自然是Script執行速度。
4、 從創立至今,微軟從未被對手真正打敗過,卻三次敗給了JavaScript,承認了JS在Web前端的獨霸地位。第一次是微軟在Asp.Net中忍痛拋棄了親生孩子--VBScript,全面支持JS;第二次是匆忙發布Ajax Extensions系列組件;第三次VS2008中集成了JQuery和代碼提示為標志,Asp.Net大有融入富客戶端之趨勢。
通過以上幾點,相信大家都不相信JavaScript在這個行業里的重要性。下面我們來了解一下JavaScript的設計模式:
一、 工廠模式
雖然Object構造函數或對象字面量都可以用來創建單個對象,但這些方式有個明顯的缺點:使用同一個接口創建很多對象,會產生大量的重復代碼。
下面我們來改變代碼的寫法試試:

函數createPerson()能夠根據接受的參數來構建一個包含所有必要信息的Person對象。可以無數次的調用這個函數,而每次它都會返回一個包含三個屬性一個方法的對象。
工廠模式雖然解決了創建多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。我們接下來了解構造方法,把每次的參數進行在一個特定的屬性內封裝起來傳遞值可以嗎?
二、 構造方法模式

在這個例子中,我們是否想起了javase里bean的構造方法呢?在這里Person()函數取代了createPerson函數。我們注意到,Person()中的代碼除了與createPerson()中相同的部分外,還存在以下不同之處:
(1)沒有顯式的創建對象;
(2)直接將屬性和方法賦予了this對象;
(3)沒有return語句。
三、 原型模式

雖然可以通過對象實例訪問保存在原型中的值,但卻不能通過對象實例重寫原型中的值。如果我們在實例中添加一個屬性,而該屬性與實例原型中的一個屬性同名,那我們就在實例中創建該屬性,該屬性將會屏蔽原型中的屬性。
四、 原型的動態性

以上代碼先創建了Person的一個實例,并將其保存在person中,然后,下一條語句在Person.prototype中添加了一個方法sayHi().即使person實例是在添加新方法之前創建的,但它仍然可以訪問這個新方法。
盡管可以隨時為原型添加屬性和方法,并且個性能夠立即在所有對象實例中反映出來,但如果是重寫整個原型對象,那么情況就不一樣了。我們知道,調用構造函數時會為實例添加一個指向最初原型的[[Prototype]]指針,而把原型修改為另外一個對象就等于切斷了構造函數與最初原型之間的聯系。請記住:實例中的指針僅指向原型,而不指向構造函數。看下面的例子:

五、 寄生構造方法模式

通常,在前述幾種模式都不適用的情況下,可以使用寄生(parasitic)構造函數模式。這種模式的基本思想是創建一個函數,該函數的作用僅僅是封裝創建對象的代碼,然后再返回新創建的對象。但從表面上看,這個函數又很像是典型的構造函數。
在上面這段代碼中,通過在構造函數的末尾添加一個return語句,可以重寫調用構造函數時返回的值。這個模式可以在特殊情況下用來為對象創建構造函數。假設我們想創建一個具有額外方法的特殊數組,由于不能直接修改Array構造函數,因此可以使用下面的寫法。

看完了JavaScript的幾種設計模式后,大家是不是對JavaScript的寫法很奇怪呢?
JavaScript的符號也很多,括號一旦寫錯,可能會引發災難性的錯誤。所以,JavaScript是一個細活,喜歡的朋友一定要養成良好的編碼習慣。對于復雜的業務JavaScript完全可以做的來。JavaScript 是一門靈活的語言,很多寫法都可以發揮自己的創新思維來寫,其靈活性同樣也帶來了很多問題。
在未來的日子里,Html5的快速發展之勢必會讓JavaScript的市場份額越來越大。喜歡前端的朋友可以一起來開拓、研究。

閩公網安備 35010202001006號