国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

JavaScript創(chuàng)建對象的七種方式全面總結(jié)

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:32:08
文檔

JavaScript創(chuàng)建對象的七種方式全面總結(jié)

JavaScript創(chuàng)建對象的七種方式全面總結(jié): JavaScript創(chuàng)建對象的方式有很多,通過Object構(gòu)造函數(shù)或?qū)ο笞置媪康姆绞揭部梢詣?chuàng)建單個對象,顯然這兩種方式會產(chǎn)生大量的重復(fù)代碼,并不適合量產(chǎn)。接下來介紹七種非常經(jīng)典的創(chuàng)建對象的方式,他們也各有優(yōu)缺點(diǎn) 工廠模式 function createPerso
推薦度:
導(dǎo)讀JavaScript創(chuàng)建對象的七種方式全面總結(jié): JavaScript創(chuàng)建對象的方式有很多,通過Object構(gòu)造函數(shù)或?qū)ο笞置媪康姆绞揭部梢詣?chuàng)建單個對象,顯然這兩種方式會產(chǎn)生大量的重復(fù)代碼,并不適合量產(chǎn)。接下來介紹七種非常經(jīng)典的創(chuàng)建對象的方式,他們也各有優(yōu)缺點(diǎn) 工廠模式 function createPerso

 JavaScript創(chuàng)建對象的方式有很多,通過Object構(gòu)造函數(shù)或?qū)ο笞置媪康姆绞揭部梢詣?chuàng)建單個對象,顯然這兩種方式會產(chǎn)生大量的重復(fù)代碼,并不適合量產(chǎn)。接下來介紹七種非常經(jīng)典的創(chuàng)建對象的方式,他們也各有優(yōu)缺點(diǎn)

工廠模式

function createPerson(name, job) {
 var o = new Object()
 o.name = name
 o.job = job
 o.sayName = function() {
 console.log(this.name)
 }
 return o
}
var person1 = createPerson(‘Jiang', ‘student')
var person2 = createPerson(‘X', ‘Doctor')

可以無數(shù)次調(diào)用這個工廠函數(shù),每次都會返回一個包含兩個屬性和一個方法的對象

工廠模式雖然解決了創(chuàng)建多個相似對象的問題,但是沒有解決對象識別問題,即不能知道一個對象的類型

構(gòu)造函數(shù)模式

function Person(name, job) {
 this.name = name
 this.job = job
 this.sayName = function() {
 console.log(this.name)
 }
}
var person1 = new Person(‘Jiang', ‘student')
var person2 = new Person(‘X', ‘Doctor')

沒有顯示的創(chuàng)建對象,使用new來調(diào)用這個構(gòu)造函數(shù),使用new后會自動執(zhí)行如下操作

創(chuàng)建一個新對象
這個新對象會被執(zhí)行[[prototype]]鏈接
這個新對象會綁定到函數(shù)調(diào)用的this
返回這個對象
使用這個方式創(chuàng)建對象可以檢測對象類型

person1 instanceof Object // true
person1 instanceof Person //true
但是使用構(gòu)造函數(shù)創(chuàng)建對象,每個方法都要在每個實(shí)例上重新創(chuàng)建一次

原型模式

function Person() {
}
Person.prototype.name = ‘Jiang'
Person.prototype.job = ‘student'
Person.prototype.sayName = function() {
 console.log(this.name)
}
var person1 = new Person()

將信息直接添加到原型對象上。使用原型的好處是可以讓所有的實(shí)例對象共享它所包含的屬性和方法,不必在構(gòu)造函數(shù)中定義對象實(shí)例信息。

原型是一個非常重要的概念,在一篇文章看懂proto和prototype的關(guān)系及區(qū)別中講的非常詳細(xì)

更簡單的寫法

function Person() {
}
Person.prototype = {
 name: ‘jiang',
 job: ‘student',
 sayName: function() {
 console.log(this.name)
 }
}
var person1 = new Person()

將Person.prototype設(shè)置為等于一個以對象字面量形式創(chuàng)建的對象,但是會導(dǎo)致.constructor不在指向Person了。

使用這種方式,完全重寫了默認(rèn)的Person.prototype對象,因此 .constructor也不會存在這里

Person.prototype.constructor === Person // false

如果需要這個屬性的話,可以手動添加

function Person() {
}
Person.prototype = {
 constructor:Person
 name: ‘jiang',
 job: ‘student',
 sayName: function() {
 console.log(this.name)
 }
}

不過這種方式還是不夠好,應(yīng)為constructor屬性默認(rèn)是不可枚舉的,這樣直接設(shè)置,它將是可枚舉的。所以可以時候,Object.defineProperty方法

Object.defineProperty(Person.prototype, ‘constructor', {
 enumerable: false,
 value: Person
})

缺點(diǎn)

使用原型,所有的屬性都將被共享,這是個很大的優(yōu)點(diǎn),同樣會帶來一些缺點(diǎn)

原型中所有屬性實(shí)例是被很多實(shí)例共享的,這種共享對于函數(shù)非常合適。對于那些包含基本值的屬性也勉強(qiáng)可以,畢竟實(shí)例屬性可以屏蔽原型屬性。但是引用類型值,就會出現(xiàn)問題了

function Person() {
}
Person.prototype = {
 name: ‘jiang',
 friends: [‘Shelby', ‘Court']
}
var person1 = new Person()
var person2 = new Person()
person1.friends.push(‘Van')
console.log(person1.friends) //[“Shelby”, “Court”, “Van”]
console.log(person2.friends) //[“Shelby”, “Court”, “Van”]
console.log(person1.friends === person2.friends) // true

friends存在與原型中,實(shí)例person1和person2指向同一個原型,person1修改了引用的數(shù)組,也會反應(yīng)到實(shí)例person2中

組合使用構(gòu)造函數(shù)模式和原型模式

這是使用最為廣泛、認(rèn)同度最高的一種創(chuàng)建自定義類型的方法。它可以解決上面那些模式的缺點(diǎn)

使用此模式可以讓每個實(shí)例都會有自己的一份實(shí)例屬性副本,但同時又共享著對方法的引用

這樣的話,即使實(shí)例屬性修改引用類型的值,也不會影響其他實(shí)例的屬性值了

function Person(name) {
 this.name = name
 this.friends = [‘Shelby', ‘Court']
}
Person.prototype.sayName = function() {
 console.log(this.name)
}
var person1 = new Person()
var person2 = new Person()
person1.friends.push(‘Van')
console.log(person1.friends) //[“Shelby”, “Court”, “Van”]
console.log(person2.friends) // [“Shelby”, “Court”]
console.log(person1.friends === person2.friends) //false

動態(tài)原型模式

動態(tài)原型模式將所有信息都封裝在了構(gòu)造函數(shù)中,初始化的時候,通過檢測某個應(yīng)該存在的方法時候有效,來決定是否需要初始化原型

function Person(name, job) {
 // 屬性
 this.name = name
 this.job = job
 // 方法
 if(typeof this.sayName !== ‘function') {
 Person.prototype.sayName = function() {
 console.log(this.name)
 }
 }

}
var person1 = new Person(‘Jiang', ‘Student')
person1.sayName()

只有在sayName方法不存在的時候,才會將它添加到原型中。這段代碼只會初次調(diào)用構(gòu)造函數(shù)的時候才會執(zhí)行。

此后原型已經(jīng)完成初始化,不需要在做什么修改了

這里對原型所做的修改,能夠立即在所有實(shí)例中得到反映

其次,if語句檢查的可以是初始化之后應(yīng)該存在的任何屬性或方法,所以不必用一大堆的if語句檢查每一個屬性和方法,只要檢查一個就行

寄生構(gòu)造函數(shù)模式

這種模式的基本思想就是創(chuàng)建一個函數(shù),該函數(shù)的作用僅僅是封裝創(chuàng)建對象的代碼,然后再返回新建的對象

function Person(name, job) {
 var o = new Object()
 o.name = name
 o.job = job
 o.sayName = function() {
 console.log(this.name)
 }
 return o
}
var person1 = new Person(‘Jiang', ‘student')
person1.sayName()

這個模式,除了使用new操作符并把使用的包裝函數(shù)叫做構(gòu)造函數(shù)之外,和工廠模式幾乎一樣

構(gòu)造函數(shù)如果不返回對象,默認(rèn)也會返回一個新的對象,通過在構(gòu)造函數(shù)的末尾添加一個return語句,可以重寫調(diào)用構(gòu)造函數(shù)時返回的值

穩(wěn)妥構(gòu)造函數(shù)模式

首先明白穩(wěn)妥對象指的是沒有公共屬性,而且其方法也不引用this。

穩(wěn)妥對象最適合在一些安全環(huán)境中(這些環(huán)境會禁止使用this和new),或防止數(shù)據(jù)被其他應(yīng)用程序改動時使用

穩(wěn)妥構(gòu)造函數(shù)模式和寄生模式類似,有兩點(diǎn)不同:一是創(chuàng)建對象的實(shí)例方法不引用this,而是不使用new操作符調(diào)用構(gòu)造函數(shù)

function Person(name, job) {
 var o = new Object()
 o.name = name
 o.job = job
 o.sayName = function() {
 console.log(name)
 }
 return o
}
var person1 = Person(‘Jiang', ‘student')
person1.sayName()

和寄生構(gòu)造函數(shù)模式一樣,這樣創(chuàng)建出來的對象與構(gòu)造函數(shù)之間沒有什么關(guān)系,instanceof操作符對他們沒有意義

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

JavaScript創(chuàng)建對象的七種方式全面總結(jié)

JavaScript創(chuàng)建對象的七種方式全面總結(jié): JavaScript創(chuàng)建對象的方式有很多,通過Object構(gòu)造函數(shù)或?qū)ο笞置媪康姆绞揭部梢詣?chuàng)建單個對象,顯然這兩種方式會產(chǎn)生大量的重復(fù)代碼,并不適合量產(chǎn)。接下來介紹七種非常經(jīng)典的創(chuàng)建對象的方式,他們也各有優(yōu)缺點(diǎn) 工廠模式 function createPerso
推薦度:
標(biāo)簽: 創(chuàng)建 方法 js
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 亚洲国产精品一区二区九九 | 伊人网中文字幕 | 久久国产精品免费一区二区三区 | 欧美老肥熟 | 久久久不卡国产精品一区二区 | 国产一区二区三区日韩欧美 | 亚洲国内精品 | 亚洲欧美日韩在线2020 | 美女露胸动态无遮挡 | 精品一区二区在线观看 | 黑人一区二区三区中文字幕 | 中文字幕第四页 | 国产va精品免费观看 | 久久久久久91香蕉国产 | 国产午夜电影在线观看 | 天美传媒精品一区 | 永久免费观看的毛片的网站 | 久久国产亚洲欧美日韩精品 | 国产区二区 | 欧美一级久久久久久久大片 | 一级一级特黄女人精品毛片视频 | 国产成人精品免费大全 | 国产福利久久青青草原下载 | 国产免费视屏 | 日韩一道本 | 国产精品一区二区久久不卡 | 欧美日韩成人午夜免费 | 国内精品久久久久久久aa护士 | 九九九国产在线 | 自拍 欧美 日韩 | 精品一成人岛国片在线观看 | 国产激情一区二区三区 | 69视频高清完整版在线观看 | 高清国产一区 | 欧美国产成人精品一区二区三区 | 亚洲国产福利 | 国产成人无精品久久久久国语 | 国产香蕉视频在线 | 亚欧精品一区二区三区 | 久久er99热精品一区二区 | 国产亚洲欧美在线人成aaaa |