5 8 屬性的訪問

2022-10-11 13:39:10 字數 4724 閱讀 9551

生成的物件可以通過屬性來訪問。對於物件的引用可以使用點運算子(.)或中括號運算子()來訪問其屬性。需要注意的是,在點運算子之後書寫的屬性名會被認為是識別符號,而中括號運算子內的則是被轉為字串值的式子。請看下面的例子:

var hzh1 = ;

console.log("輸出hzh物件的x屬性:");

console.log("hzh1.x = " + hzh1.x); // 屬性x

console.log("hzh1[x] = " + hzh1['x']); // 屬性x

var hzh2 = 'x';

console.log("hzh1[hzh2] = " + hzh1[hzh2]); // 屬性x(而非屬性key)

[running] node "e:\hmv\j**ascript\j**ascript.js"

輸出hzh物件的x屬性:

hzh1.x = 3

hzh1[x] = 3

hzh1[hzh2] = 3

[done] exited with code=0 in 0.181 seconds

不過,對於物件字面量的屬性名來說,下面這樣的識別符號或字元字面量形式的表示,都沒問題。請注意不要與上面的規則混淆。

var hzh1 = 'x';

var hzh2 = ; // 屬性hzh1(而非屬性x)

var hzh2 = ; // 屬性x

這裡需要多提一句,屬性訪問的運算物件並不是變數,而是物件的引用。這一點,可以從以下直接 對物件字面量進行運算的示例中得到確認:

console.log("確認屬性訪問的運算物件是物件的引用:");

console.log(.x); // 屬性x

console.log(['x']); // 屬性x

[running] node "e:\hmv\j**ascript\j**ascript.js"

確認屬性訪問的運算物件是物件的引用:33

[done] exited with code=0 in 0.183 seconds

現實中幾乎不會對物件字面量進行運算。不過當這種運算物件不是乙個變數時,倒是常常會以方法鏈之類的形式出現。

5.8.1 屬性值的更新
在賦值表示式的左側書寫屬性訪問表示式能夠實現對屬性值的改寫。如果指定的是不存在的屬性名,則會新增該屬性。下面將不再使用右側或左側的說法,而改用屬性讀取,以及屬性寫入這樣的術語。

可以使用 delete 運算表示式來刪除屬性。這裡需要注意的是,很難區分不存在的屬性與屬性值為undefined 值的屬性。

5.8.2 點運算子與中括號運算子在使用上的區別
有時選擇用於訪問物件屬性的這兩個運算子只憑偏好。點運算子的表述較為簡潔,所以通常都會選用點運算子。不過,中括號運算子的通用性更高。

能使用點運算子的情況一定也可以使用中括號運算子,反之未必成立。但也無需因此全都使用中括號運算子。通常預設使用表述簡潔的點運算子,只有在不得不使用中括號運算子的情況下,才使用中括號運算子。

只能使用中括號運算子的情況分為以下幾種。

包含數值或橫槓(-)的字串不能作為識別符號使用。無法作為識別符號使用的字串,不能用於點運算子的屬性名,且對於保留字,也有這樣的限制。不過,原本就不應該將保留字作為屬性名使用,所以這裡不再贅述。

像下面這樣,將含有橫槓的屬性名用於點運算子會引起錯誤。

// 含有橫槓的屬性名

var hzh = ;

console.log(hzh.huang-zihan); // 將解釋為hzh.huang減去zihan,從而造成錯誤

[running] node "e:\hmv\j**ascript\j**ascript.js"

e:\hmv\j**ascript\j**ascript.js:3

console.log(hzh.huang-zihan); // 將解釋為hzh.huang減去zihan,從而造成錯誤

^referenceerror: zihan is not defined

at object.(e:\hmv\j**ascript\j**ascript.js:3:23)

at module._compile (internal/modules/cjs/loader.js:999:30)

at object.module._extensions..js (internal/modules/cjs/loader.js:1027:10)

at module.load (internal/modules/cjs/loader.js:863:32)

at function.module._load (internal/modules/cjs/loader.js:708:14)

at function.executeuserentrypoint [as runmain] (internal/modules/run_main.js:60:12)

at internal/main/run_main_module.js:17:47

[done] exited with code=1 in 0.413 seconds

無法作為識別符號被使用的字串,仍可以在中括號運算子中使用。請看下面的例子,其中以字串值指定了乙個屬性名。

// 含有橫槓的屬性名

var hzh = ;

console.log(hzh['huang-zihan']); // 使用運算以字串值指定了乙個屬性名。可以正常執行

[running] node "e:\hmv\j**ascript\j**ascript.js"

5[done] exited with code=0 in 0.773 seconds

數值也是如此。陣列物件的屬性名都是數值。由於點運算子無法使用數值,因此只能使用中括號運算子。而且很多程式語言都是通過中括號運算子來訪問陣列的元素,所以可讀性也隨之提高。

下面的例子仍使用了之前的**,用於展示將被變數的值作為屬性名使用的情況。

var hzh1 = ;

console.log("輸出hzh物件的x屬性:");

console.log("hzh1.x = " + hzh1.x); // 屬性x

console.log("hzh1[x] = " + hzh1['x']); // 屬性x

var hzh2 = 'x';

console.log("hzh1[hzh2] = " + hzh1[hzh2]); // 屬性x(而非屬性key)

[running] node "e:\hmv\j**ascript\j**ascript.js"

輸出hzh物件的x屬性:

hzh1.x = 3

hzh1[x] = 3

hzh1[hzh2] = 3

[done] exited with code=0 in 0.181 seconds

如果表示式的求值結果是字串,可以直接用中括號運算子通過該表示式指定屬性名。下面引用出自《j**ascript 語言精粹》一書的乙個具有一定技巧性的例子。

這段**會根據數值的符號而選擇呼叫不同的方法。方法呼叫一詞會讓人覺得要使用的是點運算子,不過事實上中括號運算子也能被呼叫。

// 引用自《j**ascript語言精粹》一書

// 僅讀取數值的整數部分的處理

math[this < 0 ? 'ceiling' : 'floor'](this));

5.8.3 屬性的列舉
可以通過 for in 語句對屬性名進行列舉(**清單 5.10)。通過在 for in 語句中使用中括號運算子,可以間接地實現對屬性值的列舉。使用 for each in 語句可以直接列舉屬性值。

**清單 5.10 屬性的列舉
var hzh1 = ;

for(var key in hzh1)

[running] node "e:\hmv\j**ascript\j**ascript.js"

key = x

val = 黃子涵是帥哥!

key = y

val = 黃子涵是靚仔!

key = z

val = 黃子涵真聰明!

[done] exited with code=0 in 0.262 seconds

屬性可以分為直接屬性以及繼承於原型的屬性。for in 語句和 for each in 語句都會列舉繼承於原型的屬性。

訪問物件的屬性

1 物件導向具有的三個特性 封裝性,繼承性,多型性。2 我們在物件導向法則中不能用物件直接訪問類中的屬性,所以要將類中的屬性封裝 private 之後我們可以通過setter和getter方法設定和取得被封裝的屬性。3 構造方法可以在例項化乙個物件後可以直接把物件的值賦給屬性 構造方法的過載可以解決...

Object C屬性訪問

object c 2.0引入了屬性的概念,使得我們可以通過點方法來訪問物件的成員變數。假設有乙個類為 a,該類有乙個成員物件為 mtest mtest 是乙個型別為 b的物件,現在已經有了乙個 a類的例項物件為 a,為了能夠用 a.mtest 這樣的方式,我們需要做到以下兩點 一 在標頭檔案中用以下...

Python 屬性訪問

對於 python 而言,我們知道可以使用 property 這樣的decorator 來實現對於類的屬性訪問的控制。但是這種方法存在乙個限制,即,沒有乙個屬性需要進行屬性控制,就必須新增類似於如下的幾行語句 property defwidth self returnself.width 其實,我們...