freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

學js必看-javascript數(shù)據(jù)結(jié)構(gòu)深度剖析(編輯修改稿)

2024-08-31 15:59 本頁面
 

【文章內(nèi)容簡介】 語言的“自我”是不同的,這是一個放下了的“自我”,這就是JavaScript特有的世界觀。 對象素描 已經(jīng)說了許多了許多話題了,但有一個很基本的問題我們忘了討論,那就是:怎樣建立對象? 在前面的示例中,我們已經(jīng)涉及到了對象的建立了。我們使用了一種被稱為JavaScript Object Notation(縮寫JSON)的形式,翻譯為中文就是“JavaScript對象表示法”。 JSON為創(chuàng)建對象提供了非常簡單的方法。例如, 創(chuàng)建一個沒有任何屬性的對象: var o = {}。 創(chuàng)建一個對象并設(shè)置屬性及初始值: var person = {name: “Angel”, age: 18, married: false}。 創(chuàng)建一個對象并設(shè)置屬性和方法: var speaker = {text: “Hello World”, say: function(){alert()}}。 創(chuàng)建一個更復(fù)雜的對象,嵌套其他對象和對象數(shù)組等: var pany = { name: “Microsoft”, product: “softwares”, chairman: {name: “Bill Gates”, age: 53, Married: true}, employees: [{name: “Angel”, age: 26, Married: false}, {name: “Hanson”, age: 32, Marred: true}], readme: function() {( + ” product ” + )。} }。 JSON的形式就是用大括“{}”號包括起來的項目列表,每一個項目間并用逗號“,”分隔,而項目就是用冒號“:”分隔的屬性名和屬性值。這是典型的字典表示形式,也再次表明了 JavaScript里的對象就是字典結(jié)構(gòu)。不管多么復(fù)雜的對象,都可以被一句JSON代碼來創(chuàng)建并賦值。 其實,JSON就是JavaScript對象最好的序列化形式,它比XML更簡潔也更省空間。對象可以作為一個JSON形式的字符串,在網(wǎng)絡(luò)間自由傳遞和交換信息。而當需要將這個JSON字符串變成一個JavaScript對象時,只需要使用eval函數(shù)這個強大的數(shù)碼轉(zhuǎn)換引擎,就立即能得到一個 JavaScript內(nèi)存對象。正是由于JSON的這種簡單樸素的天生麗質(zhì),才使得她在AJAX舞臺上成為璀璨奪目的明星。 JavaScript就是這樣,把面向?qū)ο竽切┛此茝?fù)雜的東西,用及其簡潔的形式表達出來。卸下對象浮華的濃妝,還對象一個眉目清晰! 構(gòu)造對象 好了,接下我們來討論一下對象的另一種創(chuàng)建方法。 除JSON外,在JavaScript中我們可以使用new操作符結(jié)合一個函數(shù)的形式來創(chuàng)建對象。例如: function MyFunc() {}。 //定義一個空函數(shù) var anObj = new MyFunc()。 //使用new操作符,借助MyFun函數(shù),就創(chuàng)建了一個對象 JavaScript的這種創(chuàng)建對象的方式可真有意思,如何去理解這種寫法呢? 其實,可以把上面的代碼改寫成這種等價形式: function MyFunc(){}。 var anObj = {}。 //創(chuàng)建一個對象 (anObj)。 //將anObj對象作為this指針調(diào)用MyFunc函數(shù) 我們就可以這樣理解,JavaScript先用new操作符創(chuàng)建了一個對象,緊接著就將這個對象作為this參數(shù)調(diào)用了后面的函數(shù)。其實, JavaScript內(nèi)部就是這么做的,而且任何函數(shù)都可以被這樣調(diào)用!但從 “anObj = new MyFunc()” 這種形式,我們又看到一個熟悉的身影,C++和C不就是這樣創(chuàng)建對象的嗎?原來,條條大路通靈山,殊途同歸啊! 君看到此處也許會想,我們?yōu)槭裁床豢梢园堰@個MyFunc當作構(gòu)造函數(shù)呢?恭喜你,答對了!JavaScript也是這么想的!請看下面的代碼: function Person(name) //帶參數(shù)的構(gòu)造函數(shù) { = name。 //將參數(shù)值賦給給this對象的屬性 = function() {alert(”Hello, I’m ” + )。}。 //給this對象定義一個SayHello方法。 }。 function Employee(name, salary) //子構(gòu)造函數(shù) { (this, name)。 //將this傳給父構(gòu)造函數(shù) = salary。 //設(shè)置一個this的salary屬性 = function() {alert( + ” $” + )。}。 //添加ShowMeTheMoney方法。 }。 var BillGates = new Person(”Bill Gates”)。 //用Person構(gòu)造函數(shù)創(chuàng)建BillGates對象 var SteveJobs = new Employee(”Steve Jobs”, 1234)。 //用Empolyee構(gòu)造函數(shù)創(chuàng)建SteveJobs對象 ()。 //顯示:I’m Bill Gates ()。 //顯示:I’m Steve Jobs ()。 //顯示:Steve Jobs $1234 alert( == Person)。 //顯示:true alert( == Employee)。 //顯示:true alert( == )。 //顯示:false 這段代碼表明,函數(shù)不但可以當作構(gòu)造函數(shù),而且還可以帶參數(shù),還可以為對象添加成員和方法。其中的第9行,Employee構(gòu)造函數(shù)又將自己接收的 this作為參數(shù)調(diào)用Person構(gòu)造函數(shù),這就是相當于調(diào)用基類的構(gòu)造函數(shù)。第222行還表明這樣一個意思:BillGates是由Person構(gòu)造的,而SteveJobs是由Employee構(gòu)造的。對象內(nèi)置的constructor屬性還指明了構(gòu)造對象所用的具體函數(shù)! 其實,如果你愿意把函數(shù)當作“類”的話,她就是“類”,因為她本來就有“類”的那些特征。難道不是嗎?她生出的兒子各個都有相同的特征,而且構(gòu)造函數(shù)也與類同名嘛! 但要注意的是,用構(gòu)造函數(shù)操作this對象創(chuàng)建出來的每一個對象,不但具有各自的成員數(shù)據(jù),而且還具有各自的方法數(shù)據(jù)。換句話說,方法的代碼體(體現(xiàn)函數(shù)邏輯的數(shù)據(jù))在每一個對象中都存在一個副本。盡管每一個代碼副本的邏輯是相同的,但對象們確實是各自保存了一份代碼體。上例中的最后一句說明了這一實事,這也解釋了JavaScript中的函數(shù)就是對象的概念。 同一類的對象各自有一份方法代碼顯然是一種浪費。在傳統(tǒng)的對象語言中,方法函數(shù)并不象JavaScript那樣是個對象概念。即使也有象函數(shù)指針、方法指針或委托那樣的變化形式,但其實質(zhì)也是對同一份代碼的引用。一般的對象語言很難遇到這種情況。 不過,JavaScript語言有大的靈活性。我們可以先定義一份唯一的方法函數(shù)體,并在構(gòu)造this對象時使用這唯一的函數(shù)對象作為其方法,就能共享方法邏輯。例如: function SayHello() //先定義一份SayHello函數(shù)代碼 { alert(”Hello, I’m ” + )。 }。 function Person(name) //帶參數(shù)的構(gòu)造函數(shù) { = name。 //將參數(shù)值賦給給this對象的屬性 = SayHello。 //給this對象SayHello方法賦值為前面那份SayHello代碼。 }。 var BillGates = new Person(”Bill Gates”)。 //創(chuàng)建BillGates對象 var SteveJobs = new Person(”Steve Jobs”)。 //創(chuàng)建SteveJobs對象 alert( == )。 //顯示:true 其中,最后一行的輸出結(jié)果表明兩個對象確實共享了一個函數(shù)對象。雖然,這段程序達到了共享了一份方法代碼的目的,但卻不怎么優(yōu)雅。因為,定義 SayHello方法時反映不出其與Person類的關(guān)系?!皟?yōu)雅”這個詞用來形容代碼,也不知道是誰先提出來的。不過,這個詞反映了程序員已經(jīng)從追求代碼的正確、高效、可靠和易讀等基礎(chǔ)上,向著追求代碼的美觀感覺和藝術(shù)境界的層次發(fā)展,程序人生又多了些浪漫色彩。 顯然,JavaScript早想到了這一問題,她的設(shè)計者們?yōu)榇颂峁┝艘粋€有趣的prototype概念。 初看原型 prototype源自法語,軟件界的標準翻譯為“原型”,代表事物的初始形態(tài),也含有模型和樣板的意義。JavaScript中的prototype概念恰如其分地反映了這個詞的內(nèi)含,我們不能將其理解為C++的prototype那種預(yù)先聲明的概念。 JavaScript的所有function類型的對象都有一個prototype屬性。這個prototype屬性本身又是一個object類型的對象,因此我們也可以給這個prototype對象添加任意的屬性和方法。既然prototype是對象的“原型”,那么由該函數(shù)構(gòu)造出來的對象應(yīng)該都會具有這個“原型”的特性。事實上,在構(gòu)造函數(shù)的prototype上定義的所有屬性和方法,都是可以通過其構(gòu)造的對象直接訪問和調(diào)用的。也可以這么說, prototype提供了一群同類對象共享屬性和方法的機制。 我們先來看看下面的代碼: function Person(name) { = name。 //設(shè)置對象屬性,每個對象各自一份屬性數(shù)據(jù) }。 = function() //給Person函數(shù)的prototype添加SayHello方法。 { alert(”Hello, I’m ” + )。 } var BillGates = new Person(”Bill Gates”)。 //創(chuàng)建BillGates對象 var SteveJobs = new Person(”Steve Jobs”)。 //創(chuàng)建SteveJobs對象 ()。 //通過BillGates對象直接調(diào)用到SayHello方法 ()。 //通過SteveJobs對象直接調(diào)用到SayHello方法 alert( == )。 //因為兩個對象是共享prototype的SayHello,所以顯示:true 程序運行的結(jié)果表明,構(gòu)造函數(shù)的prototype上定義的方法確實可以通過對象直接調(diào)用到,而且代碼是共享的。顯然,把方法設(shè)置到prototype的寫法顯得優(yōu)雅多了,盡管調(diào)用形式?jīng)]有變,但邏輯上卻體現(xiàn)了方法與類的關(guān)系,相對前面的寫法,更容易理解和組織代碼。 那么,對于多層次類型的構(gòu)造函數(shù)情況又如何呢? 我們再來看下面的代碼: function Person(name) //基類構(gòu)造函數(shù) { = name。 }。 = function() //給基類構(gòu)造函數(shù)的prototype添加方法 { alert(”Hello, I’m ” + )。 }。 func
點擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1