日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
JavaScript創(chuàng)建對象的七種方式

JavaScript創(chuàng)建對象的方式有很多,通過Object構造函數或對象字面量的方式也可以創(chuàng)建單個對象,顯然這兩種方式會產生大量的重復代碼,并不適合量產。接下來介紹七種非常經典的創(chuàng)建對象的方式,他們也各有優(yōu)缺點。

10年的海湖新網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。全網整合營銷推廣的優(yōu)勢是能夠根據用戶設備顯示端的尺寸不同,自動調整海湖新建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)公司從事“海湖新網站設計”,“海湖新網站推廣”以來,每個客戶項目都認真落實執(zhí)行。

工廠模式

 
 
 
  1. function createPerson(name, job) { 
  2.   var o = new Object() 
  3.   o.name = name 
  4.   o.job = job 
  5.   o.sayName = function() { 
  6.     console.log(this.name) 
  7.   } 
  8.   return o 
  9. var person1 = createPerson('Jiang', 'student') 
  10. var person2 = createPerson('X', 'Doctor') 

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

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

構造函數模式

 
 
 
  1. function Person(name, job) { 
  2.   this.name = name 
  3.   this.job = job 
  4.   this.sayName = function() { 
  5.     console.log(this.name) 
  6.   } 
  7. var person1 = new Person('Jiang', 'student') 
  8. var person2 = new Person('X', 'Doctor') 

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

  • 創(chuàng)建一個新對象
  • 這個新對象會被執(zhí)行[[prototype]]鏈接
  • 這個新對象會綁定到函數調用的this
  • 返回這個對象

使用這個方式創(chuàng)建對象可以檢測對象類型

 
 
 
  1. person1 instanceof Object // true 
  2. person1 instanceof Person //true 

但是使用構造函數創(chuàng)建對象,每個方法都要在每個實例上重新創(chuàng)建一次

原型模式

 
 
 
  1. function Person() { 
  2. Person.prototype.name = 'Jiang' 
  3. Person.prototype.job = 'student' 
  4. Person.prototype.sayName = function() { 
  5.   console.log(this.name) 
  6. var person1 = new Person() 

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

更簡單的寫法

 
 
 
  1. function Person() { 
  2. Person.prototype = { 
  3.   name: 'jiang', 
  4.   job: 'student', 
  5.   sayName: function() { 
  6.     console.log(this.name) 
  7.   } 
  8. var person1 = new Person() 

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

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

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

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

 
 
 
  1. function Person() { 
  2. Person.prototype = { 
  3.   constructor:Person 
  4.   name: 'jiang', 
  5.   job: 'student', 
  6.   sayName: function() { 
  7.     console.log(this.name) 
  8.   } 

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

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

缺點

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

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

 
 
 
  1. function Person() { 
  2. Person.prototype = { 
  3.   name: 'jiang', 
  4.   friends: ['Shelby', 'Court'] 
  5. var person1 = new Person() 
  6. var person2 = new Person() 
  7. person1.friends.push('Van') 
  8. console.log(person1.friends) //["Shelby", "Court", "Van"] 
  9. console.log(person2.friends) //["Shelby", "Court", "Van"] 
  10. console.log(person1.friends === person2.friends) // true 

friends存在與原型中,實例person1和person2指向同一個原型,person1修改了引用的數組,也會反應到實例person2中

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

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

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

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

 
 
 
  1. function Person(name) { 
  2.   this.name = name 
  3.   this.friends = ['Shelby', 'Court'] 
  4. Person.prototype.sayName = function() { 
  5.   console.log(this.name) 
  6. var person1 = new Person() 
  7. var person2 = new Person() 
  8. person1.friends.push('Van') 
  9. console.log(person1.friends)  //["Shelby", "Court", "Van"] 
  10. console.log(person2.friends) // ["Shelby", "Court"] 
  11. console.log(person1.friends === person2.friends) //false 

動態(tài)原型模式

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

 
 
 
  1. function Person(name, job) { 
  2.   // 屬性 
  3.   this.name = name 
  4.   this.job = job 
  5.  
  6.   // 方法 
  7.   if(typeof this.sayName !== 'function') { 
  8.     Person.prototype.sayName = function() { 
  9.        console.log(this.name) 
  10.     } 
  11.   } 
  12.  
  13. var person1 = new Person('Jiang', 'Student') 
  14. person1.sayName() 

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

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

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

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

寄生構造函數模式

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

 
 
 
  1. function Person(name, job) { 
  2.   var o = new Object() 
  3.   o.name = name 
  4.   o.job = job 
  5.   o.sayName = function() { 
  6.     console.log(this.name) 
  7.   } 
  8.   return o 
  9. var person1 = new Person('Jiang', 'student') 
  10. person1.sayName() 

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

構造函數如果不返回對象,默認也會返回一個新的對象,通過在構造函數的末尾添加一個return語句,可以重寫調用構造函數時返回的值

穩(wěn)妥構造函數模式

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

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

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

 
 
 
  1. function Person(name, job) { 
  2.   var o = new Object() 
  3.   o.name = name 
  4.   o.job = job 
  5.   o.sayName = function() { 
  6.     console.log(name) 
  7.   } 
  8.   return o 
  9. var person1 = Person('Jiang', 'student') 
  10. person1.sayName() 

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


網站名稱:JavaScript創(chuàng)建對象的七種方式
分享鏈接:http://www.5511xx.com/article/djohpsc.html