創建對象的N種模式

来源:http://www.cnblogs.com/huanglei-/archive/2017/06/10/6978476.html
-Advertisement-
Play Games

1 new Object() 先創建一個Object實例,然後為它添加屬性和方法 2 對象字面量法 對象字面量法是創建對象最快捷方便的方式,在很多場景下被使用。 對象字面量法的缺點是創建多個同類對象時,會產生大量重覆代碼,因此有了工廠模式。 3 工廠模式 工廠模式用函數封裝了創建對象的細節,調用函數 ...


1 new Object()

先創建一個Object實例,然後為它添加屬性和方法

var Person = new Object()
Person.name = 'hl'
Person.sayName = function () {
  console.log(this.name)
}

2 對象字面量法

對象字面量法是創建對象最快捷方便的方式,在很多場景下被使用。

var Person = {
  name: 'hl',
  sayName: function () {
    console.log(this.name)
  }
}

對象字面量法的缺點是創建多個同類對象時,會產生大量重覆代碼,因此有了工廠模式。

3 工廠模式

工廠模式用函數封裝了創建對象的細節,調用函數時傳入對象屬性,然後返回一個對象。

function createPerson (name) {
  return {
    name: name,
    sayName: function () {
      console.log(this.name)
    }
  }
}
var person = createPerson('hl')
var person = new createPerson('hl') // 寄生構造函數模式

通過使用 new 操作符也可以獲得同樣的結果,這種方法被叫做寄生構造函數模式,(應該)與直接調用函數沒什麼區別。
工廠模式雖然解決了創建多個同類對象的問題,卻無法識別對象是哪種具體類型。

4 構造函數模式

通過構造函數創建的對象,可以使用 instanceof 操作符可以確定對象的類型。按照編程慣例,構造函數命名應該大寫,以和普通的函數區別開來。

function Person (name) {
  this.name = name
  this.sayName = function () {
    console.log(this.name)
  }
}
p = new Person('hl')
p instanceof Person // true

構造函數的特點:

  • 沒有顯示的創建對象
  • 屬性和方法直接賦值給this
  • 沒有 return 語句
  • 使用 new 操作符創建對象

構造函數的缺點是每個方法都會在每個實例上重新創建一遍,造成了記憶體浪費。

5 原型模式

使用原型模式,可以方便的為對象添加屬性和方法。

function Person () {
}
var p = new Person()
Person.prototype.name = 'hl'
Person.prototype.sayName = function () {
  console.log(this.name)
}
p.sayName() // hl

原型具有動態性,即先創建對象再修改原型,實例也可以獲得對應的屬性和方法。
原型模式也並非沒有缺點,第一,原型模式不能傳遞初始化參數,導致每個實例都會獲得相同的屬性;第二,對於引用類型的值,所有實例引用的是同一個對象,看下麵的例子:

function Person () {
}
Person.prototype.relative = ['father','mother']

var person1 = new Person()
var person2 = new Person()
person1.relative.push('sister')
console.log(person2.relative) // [ 'father', 'mother', 'sister' ]

修改person1的屬性,person2的屬性也被修改了。實例一般是需要有屬於自己的屬性的,因此很少單獨使用原型模式。

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

創建對象最常用的方式,就是組合使用構造函數模式和原型模式。構造函數用於自定義屬性,原型模式用於定義共用的屬性和方法。

function Person (name) {
  this.name = name
}
Person.prototype.sayName = function () {
  console.log(this.name)
}

7 動態原型模式

原型可以在構造函數中初始化,以便更好的封裝對象創建過程。

function Person(name) {
  this.name = name
  if (typeof this.sayName !== 'function') {
    Person.prototype.setName= function (name) {
      this.name = name
    }
    Person.prototype.sayName = function () {
      console.log(this.name)
    }
  }
}

不必用if檢查每一個屬性或方法,只需要檢查原型初始化後應該存在的其中一個屬性或方法即可。

8 穩妥構造函數模式

穩妥對象指的是沒有公共屬性,其屬性和方法也不引用this對象,並且不使用 new 操作符創建對象。適合用在一些需要安全的環境中,防止數據被修改。

function Person (name) {
  return {
    sayName: function () {
      console.log(name)
    }
  }
}
var person = Person('hl')

穩妥模式創建的對象,除了使用構造函數內定義的方法,沒有辦法修改和訪問傳入到構造函數中的原始數據。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 製作網站時,可能會用到視覺差效果 如圖 視覺差在製作網頁時會有很炫酷的效果,今天要講的是如何呈現動態視覺差 效果如圖: 製作方法首先需要一個視覺差的插件 我所用的插件是一款較為大眾的視覺差插件 導入這三個css文件後,在style中可以修改圖片 將圖片修改為指定gif即可 下麵介紹不使用插件方法 選 ...
  • <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>放大鏡</title> <style> *{ margin:0px; padding:0px; } #box{ width:430px; height:430px; ...
  • <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Bootstrap</tit ...
  • 在a.less中導入base.lessa.less中的代碼 base.less中的代碼 @value的值為[ripple, .5s, linear]"@{value}"成為字元串"[ripple, .5s, linear]",避免js解析錯誤。~避免編譯,不加則輸出為"ripple"Tips: 少一 ...
  • 之前對事件模型還是比較清楚的,許多概念都清晰映射在腦海中。工作之後,一方面使用的 局限性,二是習慣於用框架中的各種事件監聽方式,簡單即方便,久而久之,事件的一些概念開 始淡出記憶中,就像我現在已經開始淡忘C語言的指針、麥克斯韋方程組、矩陣的變換、最小二乘 法等。知識就像五彩繽紛的鵝卵石鋪墊在你前行的 ...
  • 基礎框架 瞭解HTML的代碼註釋 什麼是代碼註釋?代碼註釋的作用是幫助程式員標註代碼的用途,過一段時間後再看你所編寫的代碼,就能很快想起這段代碼的用途。代碼註釋不僅方便程式員自己回憶起以前代碼的用途,還可以幫助其他程式員很快的讀懂你的程式的功能,方便多人合作開髮網頁代碼。 語法: <!--註釋文字 ...
  • 上手簡單,讓Atom能夠成為了一款優雅而低門檻的神器,深度可定製的特性,讓Atom在你的打磨之下,變得越來越符合你的心意 ...
  • 理解Node.js 為了理解Node.js是如何工作的,首先你需要理解一些使得Javascript適用於伺服器端開發的關鍵特性。Javascript是一門簡單而又靈活的語言,這種靈活性讓它能夠經受住時間的考驗。函數、閉包等特性使Javascript成為一門適合Web開發的理想語言。 有一種偏見認為J ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...