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