【新東網(wǎng)技術(shù)大咖帶您走進JavaScript】微軟為什么會三次敗給JavaScript
發(fā)布時間: 2016-09-02 10:57:31
文/王龍翔 通信研發(fā)部
新東網(wǎng)自2001年成立以來,掌握大數(shù)據(jù)、云計算、通信、物聯(lián)網(wǎng)及區(qū)塊鏈等領(lǐng)先信息技術(shù),擁有一支逾16年經(jīng)驗的強大IT團隊。為沉淀企業(yè)技術(shù)實力,繼續(xù)發(fā)揮行業(yè)優(yōu)勢,《東網(wǎng)快訊》特邀新東網(wǎng)技術(shù)大咖帶您走進這些先進信息技術(shù),揭秘新東網(wǎng)16年來的技術(shù)成果,每周五發(fā)布。
在開始我們的話題之前,我們首先來認識一下JavaScript。
1、 JavaScript是門腳本語言,同時也是一門具有面向?qū)ο筇匦缘木幊?,語法擴展特性很靈活的設(shè)計語言。
2、 JavaScript有委托,有事件,有異常處理,對象模型也很豐富。雖然不能繼承,不過對象都可以無限擴展,有無繼承也沒那么多的意義了。
3、 瀏覽器市場競爭日趨白熱化,不管是IE9,FireFox X還是Chrome X,競爭的焦點都是速度,速度的核心自然是Script執(zhí)行速度。
4、 從創(chuàng)立至今,微軟從未被對手真正打敗過,卻三次敗給了JavaScript,承認了JS在Web前端的獨霸地位。第一次是微軟在Asp.Net中忍痛拋棄了親生孩子--VBScript,全面支持JS;第二次是匆忙發(fā)布Ajax Extensions系列組件;第三次VS2008中集成了JQuery和代碼提示為標志,Asp.Net大有融入富客戶端之趨勢。
通過以上幾點,相信大家都不相信JavaScript在這個行業(yè)里的重要性。下面我們來了解一下JavaScript的設(shè)計模式:
一、 工廠模式
雖然Object構(gòu)造函數(shù)或?qū)ο笞置媪慷伎梢杂脕韯?chuàng)建單個對象,但這些方式有個明顯的缺點:使用同一個接口創(chuàng)建很多對象,會產(chǎn)生大量的重復(fù)代碼。
下面我們來改變代碼的寫法試試:
函數(shù)createPerson()能夠根據(jù)接受的參數(shù)來構(gòu)建一個包含所有必要信息的Person對象??梢詿o數(shù)次的調(diào)用這個函數(shù),而每次它都會返回一個包含三個屬性一個方法的對象。
工廠模式雖然解決了創(chuàng)建多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。我們接下來了解構(gòu)造方法,把每次的參數(shù)進行在一個特定的屬性內(nèi)封裝起來傳遞值可以嗎?
二、 構(gòu)造方法模式
在這個例子中,我們是否想起了javase里bean的構(gòu)造方法呢?在這里Person()函數(shù)取代了createPerson函數(shù)。我們注意到,Person()中的代碼除了與createPerson()中相同的部分外,還存在以下不同之處:
(1)沒有顯式的創(chuàng)建對象;
(2)直接將屬性和方法賦予了this對象;
(3)沒有return語句。
三、 原型模式
雖然可以通過對象實例訪問保存在原型中的值,但卻不能通過對象實例重寫原型中的值。如果我們在實例中添加一個屬性,而該屬性與實例原型中的一個屬性同名,那我們就在實例中創(chuàng)建該屬性,該屬性將會屏蔽原型中的屬性。
四、 原型的動態(tài)性
以上代碼先創(chuàng)建了Person的一個實例,并將其保存在person中,然后,下一條語句在Person.prototype中添加了一個方法sayHi().即使person實例是在添加新方法之前創(chuàng)建的,但它仍然可以訪問這個新方法。
盡管可以隨時為原型添加屬性和方法,并且個性能夠立即在所有對象實例中反映出來,但如果是重寫整個原型對象,那么情況就不一樣了。我們知道,調(diào)用構(gòu)造函數(shù)時會為實例添加一個指向最初原型的[[Prototype]]指針,而把原型修改為另外一個對象就等于切斷了構(gòu)造函數(shù)與最初原型之間的聯(lián)系。請記?。簩嵗械闹羔槂H指向原型,而不指向構(gòu)造函數(shù)??聪旅娴睦樱?/span>
五、 寄生構(gòu)造方法模式
通常,在前述幾種模式都不適用的情況下,可以使用寄生(parasitic)構(gòu)造函數(shù)模式。這種模式的基本思想是創(chuàng)建一個函數(shù),該函數(shù)的作用僅僅是封裝創(chuàng)建對象的代碼,然后再返回新創(chuàng)建的對象。但從表面上看,這個函數(shù)又很像是典型的構(gòu)造函數(shù)。
在上面這段代碼中,通過在構(gòu)造函數(shù)的末尾添加一個return語句,可以重寫調(diào)用構(gòu)造函數(shù)時返回的值。這個模式可以在特殊情況下用來為對象創(chuàng)建構(gòu)造函數(shù)。假設(shè)我們想創(chuàng)建一個具有額外方法的特殊數(shù)組,由于不能直接修改Array構(gòu)造函數(shù),因此可以使用下面的寫法。
看完了JavaScript的幾種設(shè)計模式后,大家是不是對JavaScript的寫法很奇怪呢?
JavaScript的符號也很多,括號一旦寫錯,可能會引發(fā)災(zāi)難性的錯誤。所以,JavaScript是一個細活,喜歡的朋友一定要養(yǎng)成良好的編碼習(xí)慣。對于復(fù)雜的業(yè)務(wù)JavaScript完全可以做的來。JavaScript 是一門靈活的語言,很多寫法都可以發(fā)揮自己的創(chuàng)新思維來寫,其靈活性同樣也帶來了很多問題。
在未來的日子里,Html5的快速發(fā)展之勢必會讓JavaScript的市場份額越來越大。喜歡前端的朋友可以一起來開拓、研究。