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