最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript創(chuàng)建對象的七種方式(推薦)

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

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

工廠模式

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)建對象,每個方法都要在每個實例上重新創(chuàng)建一次

原型模式

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

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

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

更簡單的寫法

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了。

使用這種方式,完全重寫了默認的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屬性默認是不可枚舉的,這樣直接設(shè)置,它將是可枚舉的。所以可以時候,Object.defineProperty方法

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

缺點

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

原型中所有屬性實例是被很多實例共享的,這種共享對于函數(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存在與原型中,實例person1和person2指向同一個原型,person1修改了引用的數(shù)組,也會反應(yīng)到實例person2中

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

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

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

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

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)完成初始化,不需要在做什么修改了

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

其次,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ù)如果不返回對象,默認也會返回一個新的對象,通過在構(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ù)模式和寄生模式類似,有兩點不同:一是創(chuàng)建對象的實例方法不引用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操作符對他們沒有意義

以上所述是小編給大家介紹的JavaScript創(chuàng)建對象的七種方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • JavaScript本地存儲實現(xiàn)用戶名存儲案例

    JavaScript本地存儲實現(xiàn)用戶名存儲案例

    本文主要介紹了JavaScript本地存儲實現(xiàn)用戶名存儲案例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • springMvc 前端用json的方式向后臺傳遞對象數(shù)組方法

    springMvc 前端用json的方式向后臺傳遞對象數(shù)組方法

    今天小編就為大家分享一篇springMvc 前端用json的方式向后臺傳遞對象數(shù)組方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 使用SpreadJS快速清除Excel中工作表保護密碼

    使用SpreadJS快速清除Excel中工作表保護密碼

    這篇文章主要為大家介紹了使用SpreadJS快速清除Excel中工作表保護密碼方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • JavaScript數(shù)組隨機排列實現(xiàn)隨機洗牌功能

    JavaScript數(shù)組隨機排列實現(xiàn)隨機洗牌功能

    這篇文章主要介紹了JavaScript數(shù)組隨機排列實現(xiàn)隨機洗牌功能的方法,涉及javascript中基于list.sort方法實現(xiàn)數(shù)組隨機排列的技巧,可應(yīng)用于隨機洗牌,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • 微信小程序?qū)崿F(xiàn)多行文字滾動

    微信小程序?qū)崿F(xiàn)多行文字滾動

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)多行文字滾動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Typescript定義多個接口類型聲明的方式小結(jié)

    Typescript定義多個接口類型聲明的方式小結(jié)

    這篇文章主要介紹了Typescript定義多個接口類型聲明的方式小結(jié),在 TypeScript 中,您可以使用交叉類型(&)或聯(lián)合類型(|)來組合多個接口,從而實現(xiàn)多個接口類型的混合,文中通過代碼講解的非常詳細,需要的朋友可以參考下
    2025-01-01
  • JS獲取IP、MAC和主機名的五種方法

    JS獲取IP、MAC和主機名的五種方法

    javascript獲取客戶端IP的小程序,下面的代碼是我在所有windowsNT5.0及以上的系統(tǒng)上都測試通過的,喜歡的朋友可以收藏下
    2013-11-11
  • 制作微信小程序的小白簡單入門教程

    制作微信小程序的小白簡單入門教程

    這篇文章主要介紹了制作微信小程序的小白簡單入門教程。本文就是小程序?qū)W習筆記,整理成教程的形式,希望對于初學者有用。需要學會的主要知識點都會講到,目標是你讀完這個教程,就能學會怎么寫小程序。
    2022-12-12
  • js獲取下拉列表框<option>中的value和text的值示例代碼

    js獲取下拉列表框<option>中的value和text的值示例代碼

    本篇文章主要是對js獲取下拉列表框<option>中的value和text的值示例代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • Three.js中的紋理圖像應(yīng)用和屬性調(diào)整方法

    Three.js中的紋理圖像應(yīng)用和屬性調(diào)整方法

    在three.js中紋理貼圖是用來給物體表面添加圖案、顏色或者其他視覺效果的一種技術(shù),這篇文章主要給大家介紹了關(guān)于Three.js中紋理圖像應(yīng)用和屬性調(diào)整的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評論

潍坊市| 巴林右旗| 林州市| 清流县| 博罗县| 灯塔市| 东阿县| 元阳县| 永寿县| 寻乌县| 鹤山市| 福泉市| 久治县| 正宁县| 碌曲县| 昌乐县| 琼中| 大洼县| 和政县| 珠海市| 仁布县| 余干县| 章丘市| 南漳县| 古蔺县| 随州市| 黎川县| 麻城市| 五寨县| 祥云县| 安阳市| 上思县| 卢湾区| 鄢陵县| 东光县| 黄山市| 台中市| 义马市| 公安县| 开平市| 库车县|