首頁 web前端 js教程 學習Javascript物件導向程式設計之封裝_javascript技巧

學習Javascript物件導向程式設計之封裝_javascript技巧

May 16, 2016 pm 03:14 PM
javascript 封裝

Javascript是一種基於物件(object-based)的語言,你遇到的所有東西幾乎都是物件。但是,它又不是真正的物件導向程式設計(OOP)語言,因為它的語法中沒有class(類別)。
那麼,如果我們要把"屬性"(property)和"方法"(method),封裝成一個對象,甚至要從原型對象產生一個實例對象,我們該怎麼做呢?
一、 生成物件的原始模式
假定我們把貓看成一個對象,它有"名字"和"顏色"兩個屬性。

var Cat = {
    name : '',
    color : ''
  }
登入後複製

現在,我們需要根據這個原型物件的規格(schema),產生兩個實例物件。 

var cat1 = {}; // 创建一个空对象
    cat1.name = "大毛"; // 按照原型对象的属性赋值
    cat1.color = "黄色";
  var cat2 = {};
    cat2.name = "二毛";
    cat2.color = "黑色";
登入後複製

好了,這就是最簡單的封裝了,把兩個屬性封裝在一個物件裡面。但是,這樣的寫法有兩個缺點,一是如果多生成幾個實例,寫起來就非常麻煩;二是實例與原型之間,沒有任何辦法,可以看出有什麼關聯。
二、 原始模式的改良
我們可以寫一個函數,解決程式碼重複的問題。

function Cat(name,color){
    return {
      name:name,
      color:color
    }
  }
登入後複製

然後產生實例對象,就等於是在呼叫函數:  

var cat1 = Cat("大毛","黄色");
  var cat2 = Cat("二毛","黑色");
登入後複製

這種方法的問題依然是,cat1和cat2之間沒有內在的聯繫,不能反映出它們是同一個原型物件的實例。
三、 建構子模式
為了解決從原型物件產生實例的問題,Javascript提供了一個建構函式(Constructor)模式。
所謂"建構函數",其實就是一個普通函數,但內部使用了this變數。對建構子使用new運算符,就能產生實例,並且this變數會綁定在實例物件上。
例如,貓的原型物件現在可以這樣寫,
 

 function Cat(name,color){
    this.name=name;
    this.color=color;
  }
登入後複製

我們現在就可以產生實例物件了。

 var cat1 = new Cat("大毛","黄色");
  var cat2 = new Cat("二毛","黑色");
  alert(cat1.name); // 大毛
  alert(cat1.color); // 黄色
登入後複製

這時cat1和cat2會自動含有一個constructor屬性,指向它們的建構子。 

alert(cat1.constructor == Cat); //true
  alert(cat2.constructor == Cat); //true
登入後複製

Javascript也提供了一個instanceof運算符,驗證原型物件與實例物件之間的關係。 

 alert(cat1 instanceof Cat); //true
  alert(cat2 instanceof Cat); //true
登入後複製

四、建構子模式的問題
建構函式方法很好用,但是存在一個浪費記憶體的問題。
請看,我們現在為Cat物件添加一個不變的屬性"type"(種類),再增加一個方法eat(吃老鼠)。那麼,原型物件Cat就變成了下面這樣: 

 function Cat(name,color){
    this.name = name;
    this.color = color;
    this.type = "猫科动物";
    this.eat = function(){alert("吃老鼠");};
  }
登入後複製

還是採用同樣的方法,產生實例:

 var cat1 = new Cat("大毛","黄色");
  var cat2 = new Cat ("二毛","黑色");
  alert(cat1.type); // 猫科动物
  cat1.eat(); // 吃老鼠
登入後複製

表面上好像沒什麼問題,但是實際上這樣做,有一個很大的弊端。那就是對於每一個實例對象,type屬性和eat()方法都是一模一樣的內容,每一次產生一個實例,都必須為重複的內容,多佔用一些記憶體。這樣既不環保,也缺乏效率。  

alert(cat1.eat == cat2.eat); //false
登入後複製

能不能讓type屬性和eat()方法在記憶體中只產生一次,然後所有實例都指向那個記憶體位址呢?回答是可以的。
五、 Prototype模式
Javascript規定,每一個建構函式都有一個prototype屬性,指向另一個物件。這個物件的所有屬性和方法,都會被建構函式的實例繼承。
這意味著,我們可以把那些不變的屬性和方法,直接定義在prototype物件上:

 function Cat(name,color){
    this.name = name;
    this.color = color;
  }
  Cat.prototype.type = "猫科动物";
  Cat.prototype.eat = function(){alert("吃老鼠")};
登入後複製

然後,產生實例。

 var cat1 = new Cat("大毛","黄色");
  var cat2 = new Cat("二毛","黑色");
  alert(cat1.type); // 猫科动物
  cat1.eat(); // 吃老鼠
登入後複製

這時所有實例的type屬性和eat()方法,其實都是同一個記憶體位址,指向prototype對象,因此就提高了運行效率。

 alert(cat1.eat == cat2.eat); //true
登入後複製

六、 Prototype模式的驗證方法
為了配合prototype屬性,Javascript定義了一些輔助方法,幫助我們使用它。 ,
6.1 isPrototypeOf()
這個方法用來判斷,某個proptotype物件和某個實例之間的關係。

 alert(Cat.prototype.isPrototypeOf(cat1)); //true
  alert(Cat.prototype.isPrototypeOf(cat2)); //true
登入後複製

6.2 hasOwnProperty()
每個實例物件都有一個hasOwnProperty()方法,用來判斷某一個屬性到底是本地屬性,還是繼承自prototype物件的屬性。 

 alert(cat1.hasOwnProperty("name")); // true
  alert(cat1.hasOwnProperty("type")); // false
登入後複製

6.3 in運算子
in運算子可以用來判斷,某個實例是否含有某個屬性,不管是不是本地屬性。 

 alert("name" in cat1); // true
  alert("type" in cat1); // true
登入後複製

in運算子還可以用來遍歷某個物件的所有屬性。 

 for(var prop in cat1) { alert("cat1["+prop+"]="+cat1[prop]); }
登入後複製

以上就是關於javascript封裝的全部內容,希望對大家的學習有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

集邦諮詢:英偉達 Blackwell 平台產品帶動台積電今年 CoWoS 產能提升 150% 集邦諮詢:英偉達 Blackwell 平台產品帶動台積電今年 CoWoS 產能提升 150% Apr 17, 2024 pm 08:00 PM

本站4月17日消息,集邦諮詢(TrendForce)近日發布報告,認為英偉達Blackwell新平台產品需求看漲,預估帶動台積電2024年CoWoS封裝總產能提升逾150%。英偉達Blackwell新平台產品包含B系列的GPU,以及整合英偉達自家GraceArmCPU的GB200加速卡等。集邦諮詢確認為供應鏈目前非常看好GB200,預估2025年出貨量預計超過百萬片,在英偉達高階GPU中的佔比達到40-50%。在英偉達計畫下半年交付GB200以及B100等產品,但上游晶圓封裝方面須進一步採用更複

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

AMD 'Strix Halo” FP11 封裝尺寸曝光:和英特爾 LGA1700 相當,比 Phoenix 大 60% AMD 'Strix Halo” FP11 封裝尺寸曝光:和英特爾 LGA1700 相當,比 Phoenix 大 60% Jul 18, 2024 am 02:04 AM

本站7月9日訊息,AMDZen5架構「Strix」系列處理器會有兩種封裝方案,其中較小的StrixPoint將採用FP8封裝,而StrixHalo將會採用FP11封裝。圖源:videocardz訊息源@Olrak29_最新曝料稱StrixHalo的FP11封裝尺寸為37.5mm*45mm(1687平方毫米),和英特爾AlderLake、RaptorLakeCPU的LGA-1700封裝尺寸相同。 AMD最新的PhoenixAPU採用FP8封裝方案,尺寸為25*40mm,這意味著StrixHalo的F

See all articles