亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

js中創建對象的幾種方式

2024-04-27 15:06:28
字體:
來源:轉載
供稿:網友

博客原文地址:Claiyre的個人博客 https://claiyre.github.io/ 博客園地址:http://www.cnblogs.com/nuannuan7362/ 如需轉載,請在文章開頭注明原文地址 士不可以不弘毅,任重而道遠。

前言

不管是哪門語言,千變萬化不離其宗,深入理解其本質,方能應用自如。對應到js,閉包,原型,函數,對象等是需要花費大功夫思考、理解的。本文穿插了js原型和函數的相關知識,討論了批量創建對象的幾種方式以及它們的優缺點。

正文

說起創建對象,最容易想到的便是通過對象字面量方式直接定義一個對象吧,但這種方式只能創建少量,單獨且相互間無聯系的對象。若要批量創建對象,該如何?

工廠模式

工廠模式非常直觀,將創建對象的過程抽象為一個函數,用函數封裝以特定接口創建對象的細節。如下所示:

function createStudent(name,sex,grade){ var o = new Object(); o.name = name; o.sex = sex; o.grade = grade; o.sayName = function(){ console.log(this.name); } return o;}var s1 = createStudent('Claiyre','famale',1);

通俗地講,工廠模式就是將創建對象的語句放在一個函數里,通過傳入參數來創建特定對象,最后返回創建的對象。 工廠模式雖然可以創建多個相似的對象,但卻不能解決對象標識的問題,即怎樣知道一個對象的類型。構造函數模式應運而生。

構造函數模式

構造函數模式是java語言創建對象的通用方式。兩種語言用構造函數創建對象的方式略有不同,注意區別。 在JavaScript中沒有類的概念,函數即為一等公民,因此,不必顯式聲明某個類,直接創建構造函數即可,類的方法和屬性在構造函數中(或原型對象上)處理。構造函數模式的示例代碼如下:

function Student(name,sex,grade){ this.name = name; this.sex = sex; this.grade = grade; this.sayName = function(){ console.log(this.name); }}var s2 = new Student('孫悟空','male',2);

細心的朋友一定發現了構造函數的函數名首字母是大寫的,而普通函數首字母則是小寫,這是眾多OO語言約定俗成的規定,雖然大多數情況下不大寫也不會報錯,但是為了代碼的規范性和可讀性,還是應該將構造函數的首字母大寫,與普通函數區別開。 與工廠模式相比,用構造模式創建對象有以下幾點不同:

沒有顯示地創建對象直接將屬性和方法賦給this對象沒有return語句

此外,還應注意到要創建Student的實例,必須要使用new操作符,創建的實例對象將有一個constructor(構造器)屬性,指向Person構造函數。調用構造函數創建對象經過了以下幾個過程:

創建一個新對象將構造函數的作用域賦給新對象(因此this就指向了這個新對象)執行構造函數中的代碼返回新對象(不需要顯式返回)

構造函數雖好用,但也不是沒有缺點。使用構造函數的主要問題是:每個方法都要在每個實例上創建一遍。在ECMAScript中,函數即對象,因此每定義一個函數,也就是實例化了一個對象。下面的例子證明了這個缺點。

var s3 = new Student('唐僧','male',3);var s4 = new Student('白骨精','female',4);s3.sayName();s4.sayName();console.log(s3.sayName == s4.sayName);

運行結果:

也就是說通過構造函數實例化的多個對象的方法,是多個不同的方法,但它們內部的代碼以及實現的功能是相同的,這就造成了一定的資源浪費。 幸運的是,這個問題可以用原型模式來解決。

原型模式

js中,每個函數都有一個PRototype屬性,它是一個指針,指向一個對象,叫做原型對象,原型對象包含了可以由特定類型的所有實例對象共享的屬性和方法。此外,這個對象有一個與生自來的屬性constructor,指向創建對象的構造方法。 使用原型模式可以讓所有的實例共享原型對象中的屬性和方法,也就是說,不必再構造函數中定義對象實例的信息。用代碼表示如下:

function Student_1(){}Student_1.prototype.name = 'Claiyre';Student_1.prototype.sex = 'female';Student_1.prototype.class = 5;Student_1.prototype.sayName = function (){ console.log(this.name);}var s5 = new Student_1();s5.sayName(); //Claiyrevar s6 = new Student_1();s6.sayName(); //Claiyre

一張圖勝過千言萬語,下圖清楚地闡釋了各個對象和原型對象間的關系:

了解過原型后,可以繼續在實例對象上增添屬性或方法:

s6.name = 'John';s6.sayName(); //John

當要讀取某個對象的屬性時,都會執行一次搜索,搜索首先從對象實例本身開始,如果在實例中找到了這個屬性,則搜索結束,返回實例屬性的值;若實例上沒有找到,則繼續向對象的原型對象延伸,搜索對象的原型對象,若在原型對象上找到了,則返回原型上相應屬性的值,若沒有找到,則返回undefined。因此,實例對象屬性會覆蓋原型對象上的同名屬性,所以上面第二行代碼輸出的是John。 - Object.getPrototypeOf(object)方法返回參數對象的原型對象。 - Object.keys(object)方法返回對象上課枚舉的實例屬性。 原型中的所有屬性都是被所有實例所共享的,這種共享對于函數來說非常合適,對于包含基本值的屬性也說的過去(實例屬性會覆蓋原型同名屬性),但對于那些包含引用類型的屬性,可有大麻煩了

Student_1.prototype.friends = ['aa','bb'];console.log('s6的朋友' + s6.friends);s5.friends.push('cc');console.log('s5的朋友' + s5.friends);console.log('s6的朋友' + s6.friends);

運行結果:

問題來了,我們只想改變s5的朋友列表,但由于原型模式的共享本質,s6的朋友列表也隨之改變了。 因此,很少單獨使用原型模式。

組合使用構造函數和原型模式

構造函數模式用于定義實例屬性,原型模式則用于定義方法和共享的屬性。這種混合模式不僅支持向構造函數傳入參數,還最大限度地節約了內存,可謂是集兩模式之長。示例代碼如下:

function Student(name,sex,grade){ this.name = name; this.sex = sex; this.grade = grade;}Student.prototype.sayName = function(){ console.log(this.name);}Student.prototype.school = 'Joooh school';

其他模式

除了以上幾種常見的模式外,批量創建對象的方式還有

動態原型模式:僅在第一次調用構造函數時,將方法賦給原型對象的相應屬性,其他示例的處理方式同構造函數模式寄生構造函數模式:僅僅封裝創建對象的代碼,然后再返回新創建的對象,仍使用new操作符調用穩妥構造函數模式:沒有公共屬性,只有私有變量和方法,以及一些get/set方法,用以處理私有變量。

結語

每種模式都有各自的優缺點,具體要使用哪種,還需結合實際場景,深入理解,靈活運用。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线私人| 国产精品爽黄69天堂a| 国产欧美久久久久久| 蜜月aⅴ免费一区二区三区| 成人精品久久一区二区三区| 久久久免费在线观看| 日韩资源在线观看| 一个人www欧美| 精品少妇一区二区30p| 在线观看国产欧美| 欧美最猛性xxxxx(亚洲精品)| 欧美视频中文字幕在线| 欧美亚洲视频在线看网址| 国内免费精品永久在线视频| 久久久久久久激情视频| 91系列在线播放| 亚洲人成网站免费播放| 午夜精品久久久久久久99热| 欧美性猛交xxx| 精品二区三区线观看| 欧洲成人在线视频| 亚洲人成欧美中文字幕| 亚洲国产美女久久久久| 国产成人aa精品一区在线播放| 亚洲女人被黑人巨大进入al| 日韩有码片在线观看| 亚洲免费视频观看| 国产精品久久99久久| 少妇高潮久久久久久潘金莲| 精品亚洲夜色av98在线观看| 国内精品久久久久影院 日本资源| 国产综合色香蕉精品| 日韩欧美成人区| 国产精品久久一| 国产精品久久久久久久美男| 欧美视频13p| 欧美亚洲午夜视频在线观看| 亚洲国产精品人久久电影| 国产成人精品免费久久久久| 国产欧美一区二区三区久久| 欧美日本中文字幕| 欧美成人在线免费| 欧美午夜精品久久久久久浪潮| 亚洲欧美变态国产另类| 91大神在线播放精品| 久久99精品视频一区97| 狠狠色噜噜狠狠狠狠97| 亚洲成人亚洲激情| 日韩精品中文字幕在线| 不用播放器成人网| 精品视频久久久久久| 欧美日韩精品在线播放| 国产精品色午夜在线观看| 亚洲一区二区三区毛片| 精品在线欧美视频| 久久久久久香蕉网| 国产视频一区在线| 一区二区三区视频免费| 欧美性猛交xxxx偷拍洗澡| 日韩大陆毛片av| 国产精品成人一区| 欧美福利视频在线观看| 国内精品国产三级国产在线专| 亚洲性视频网站| 久久99久久99精品中文字幕| 国产精品男女猛烈高潮激情| 日韩精品视频免费| 中文在线不卡视频| 色偷偷av亚洲男人的天堂| 久久久91精品国产一区不卡| 亚洲综合成人婷婷小说| 色偷偷偷亚洲综合网另类| 国内精品模特av私拍在线观看| 91久久精品视频| 亚洲爱爱爱爱爱| 日韩有码在线电影| 国模精品视频一区二区| 亚洲网站在线观看| 亚洲精品资源美女情侣酒店| 欧美日韩国产一区在线| 26uuu另类亚洲欧美日本老年| 久久久亚洲天堂| 久久精品亚洲国产| 久久精品国产亚洲一区二区| 久久久精品电影| 亚洲天堂av高清| 国产精品中文久久久久久久| 神马国产精品影院av| 日韩av电影手机在线观看| 日本成人在线视频网址| 欧美另类老女人| 中文字幕亚洲欧美日韩高清| 欧美亚洲国产日本| 国产精品黄色av| 亚洲一区二区三区777| 久久这里有精品| 国产精自产拍久久久久久| 亚洲欧美日韩中文在线制服| 亚洲天堂成人在线视频| 91亚洲精品在线| 日韩理论片久久| 亚洲色图偷窥自拍| 亚洲欧美一区二区精品久久久| 日韩欧美中文在线| 亚洲精品小视频| 日韩精品一区二区视频| 91在线中文字幕| 国产精品电影网| 久久久久久12| 欧美激情亚洲激情| 国产在线不卡精品| 97视频在线观看成人| 欧洲成人免费aa| 中文字幕欧美日韩在线| 欧美成人激情视频免费观看| 伦理中文字幕亚洲| 亚洲成人久久久| 亚洲一区二区在线| 欧美福利视频在线观看| 欧美最猛性xxxx| 韩日欧美一区二区| 精品欧美一区二区三区| 日韩精品中文字幕久久臀| 欧美日韩一区二区三区在线免费观看| 欧美性xxxx在线播放| 精品magnet| 欧美午夜性色大片在线观看| 日韩高清不卡av| 亚洲欧美日韩一区二区在线| 国产精品久久久久久久一区探花| 亚洲自拍高清视频网站| 欧美高清在线视频观看不卡| 欧美日韩成人在线视频| 欧美一区二区.| 国内精品视频在线| 97久久精品视频| 在线观看欧美www| 欧美成人黄色小视频| 国产999精品久久久影片官网| 丝袜亚洲欧美日韩综合| 8050国产精品久久久久久| 4p变态网欧美系列| 亚洲精品有码在线| 亚洲天堂av在线播放| 日本国产一区二区三区| 91免费综合在线| 亚洲色图35p| 668精品在线视频| 91成人天堂久久成人| 国模极品一区二区三区| 成人黄色免费在线观看| 中文字幕免费国产精品| 在线免费观看羞羞视频一区二区| 亚洲午夜久久久久久久| 北条麻妃一区二区三区中文字幕| 91精品国产99久久久久久| 国产成人精品一区二区在线| 久久全国免费视频| 中文字幕综合一区| 欧美激情综合亚洲一二区| 国产在线观看不卡| 亚洲第一免费网站| 欧美性受xxx| 91精品视频在线免费观看|