js物件導向程式設計一 封裝

2021-08-20 06:45:07 字數 3143 閱讀 5168

js是物件導向程式設計的語言,既是它的函式,陣列,屬性都是物件,可以設定物件的屬性和方法。

一.生成物件的原始模式

假定把貓看成乙個物件,它有name和color兩個屬性.

var cat =

現在,我們需要根據這個原型物件的規格,生成兩個例項物件.

var cat1 = {};//建立乙個空物件

cat1.name = "大毛";//按照原型物件的屬性賦值

cat1.color = "黃色"

var cat2 = {};

cat2.name = "二毛";

cat2.color = "黑色"

這是最簡單的封裝了,把兩個屬性封裝在乙個物件裡面.但是,這樣的寫法有兩個缺點:1.如果多生成幾個例項,寫起來就非常麻煩;2.例項和原型之間,沒有任何辦法,可以看出有什麼聯絡.

二.原始模式的改進

寫乙個函式,解決**的重複問題

function cat(name,color)

}然後生成例項物件,就等於在呼叫函式:

var cat1 = cat("大毛","黃色");

var cat2 = cat("二毛","黑色");

這個方法的問題依然是,cat1 和 cat2 之間沒有內在聯絡,不能反映出他們是同乙個原型物件的例項.

三.建構函式模式

為了解決從原型物件生成例項的問題,js 提供了一種建構函式( constructor )模式.

所謂"建構函式",其實就是乙個普通函式,內部使用了this變數. 對建構函式使用 new 運算子,就能生成例項, 並且 this 物件會繫結在例項物件上.

比如,貓的原型物件可以這樣寫,

function cat(name,color)

現在,我們就可以生成例項物件了:

var cat1 = new cat("大毛","黃色");

var cat2 = new cat("二毛","黑色");

alert(cat1.name);//大毛

alert(cat2.name);//二毛

console.log(cat1);//cat(constructor)

這時,cat1 和 cat2 會自動含有乙個 constructor 屬性, 指向他們的建構函式.

console.log(cat1.constructor === cat);//true

console.log(cat2.constructor === cat);//true

js還提供了乙個 instanceof 運算子, 驗證原型物件與例項物件之間的關係.

alert(cat1 instanceof cat);//true

alert(cat2 instanceof cat);//true

2 37 829

30

四.建構函式模式的問題

建構函式方法很好用,但是存在乙個浪費記憶體的問題.

請看,我們現在為cat物件新增乙個不變屬性type(種類),和乙個方法eat(吃).那麼,原型物件 cat 就變成了下面這樣:

function cat(name,color)

}採用同樣的方法,生成例項:

var cat1 = new cat("大毛","黃色");

var cat2 = new cat("二毛","黑色");

alert(cat1.type);//貓科動物

cat2.eat();//吃老鼠

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

alert(cat1.eat == cat2.eat);//false

能不能讓type屬性和eat()方法在記憶體中只生成一次,然後所有例項都指向那個記憶體位址呢?回答是可以的.

五.prototype模式

js規定, 每乙個建構函式都有乙個 prototype 屬性, 指向另乙個物件. 這個物件上所有屬性和方法, 都會被建構函式的例項繼承.

這就意味著,我們可以把那些不變的屬性和方法, 直接定義在prototype物件上.

function cat(name,color)

cat.prototype.type = "貓科動物";

cat.prototype.eat = function()

//生成例項

var cat1 = new cat("大毛","黃色");

var cat2 = new cat("二毛","黑色");

alert(cat1.type);//貓科動物

cat1.eat();//吃老鼠

這時所有例項的type屬性和eat()方法,其實都是同乙個記憶體位址,指向prototype物件,因此就提高了運算效率.

alert(cat1.eat == cat2.eat);//true

六.prototype模式的驗證方法

為了配合 prototype 屬性, js定義了一些輔助方法, 幫助我們使用它.

6.1 isprototypeof()

這個方法用來判斷, 某個prototype物件和某個例項之間的關係.

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 運算子

1. in 運算子可以用來判斷,某個例項是否具有某個屬性,不管是不是本地屬性.

alert("name" in cat1);//true

alert("type" in cat2);//true

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

for(var prop in cat1)

總結:這一部分主要介紹了如何"封裝"資料和方法, 以及如何從原型物件中生成例項.

Java基礎 物件導向(一)封裝

一 什麼是物件導向?怎麼理解物件導向?1.物件導向的三個特點 a 物件導向就是一種常見的思想,符合人們的思考習慣。b 物件導向的出現,將複雜的問題簡單化。c 物件導向的出現,讓程靜在過程中的執行者,變成了物件中的指揮者。2.類和物件的區別 類 明確該事物的屬性和行為並定義在其中。物件 其實就是該類事...

一 封裝(C物件導向開發)

內容參考於 抽象接 術和元件開發規範及其思想 在c語言中,可以使用乙個c檔案 c 檔案 和 件完 h 檔案 成 類 的定義,將所有需要封裝的東西都存於c 檔案中,h 檔案中只展現那些對外可見 無需封裝 重點 的內容。1.示例1 乙個棧物件的例子。stack.h ifndef stack h defi...

06 02 物件導向的特徵一 封裝

定義屬性就是為了使用,所以隱藏並不是目的,隱藏屬性的目的在於限制類外部對資料的直接操作 然後類內應該提供相應的介面來允許類外部間接地運算元據 介面之上可以附加額外的邏輯來對資料的操作進行嚴格地控制 這就是隱藏屬性和開放介面的意義 python的class機制採用雙下劃線開頭的方式將屬性隱藏起來,類屬...