屬性訪問器
轉載地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Property_Accessors
屬性訪問器提供了兩種方式用於訪問一個對象的屬性,它們分別是點號和方括號。
語法
object.property
object["property"]
描述
我們可以將對象看做是一個關聯數組,或映射,字典,哈希表,查找表。這個數組中的鍵就是這個對象中屬性的名稱。通常,當我們提及一個對象的屬性時,會對屬性與方法之間做個對比。然而,屬性與方法之間的區別並不大。一個方法就是一個可以被調用的屬性而已,例如一個指向Function實例的引用可以作為對象屬性的值。
訪問對象屬性有兩種方式:點號表示法和方括號表示法。
點號表示法
get = object.property;
object.property = set;
以上代碼中,property
必須是一個有效的 JavaScript 標識符,例如,一串字母數字字符,也包括下劃線及美元符號,但不能以數字作為開頭。比如,object.$1
是合法的,而 object.1
是無效不合法的。
document.createElement(‘pre‘);
在上述代碼塊中,document
中存在一個名為"createElement"的方法並且被調用了。
如果對數字字面量使用方法,並且數字文字沒有指數且沒有小數點,請在方法調用之前的點之前留出空格,以防止點被解釋為小數點。
77 .toExponential(); // or 77 .toExponential(); // or (77).toExponential(); // or 77..toExponential(); // or 77.0.toExponential(); // because 77. === 77.0, no ambiguity
方括號表示法
get = object[property_name];
object[property_name] = set;
property_name
是一個字符串。該字符串不一定是一個合法的標識符;它可以是任意值,例如,"1foo","!bar!", 甚至是一個空格。
document[‘createElement‘](‘pre‘);
這裏的代碼的功能跟上一個列子的作用是相同的。
括號之前允許有空格。
document [‘createElement‘](‘pre‘);
屬性名
屬性名必須是字符串。這意味著非字符串對象不能用來作為一個對象屬性的鍵。任何非字符串對象,包括number,可通過toString方法,類型轉換成一個字符串。
var object = {}; object[‘1‘] = ‘value‘; console.log(object[1]);
上述代碼的輸出為"value",因為1被類型轉換為‘1‘。
var foo = {unique_prop: 1}, bar = {unique_prop: 2}, object = {}; object[foo] = ‘value‘; console.log(object[bar]);
[]操作符都會默認調用toString方法
[foo]被轉化為[Object object]字符串
上述的代碼的輸出也是"value",由於對象foo和bar 都會被轉成相同的字符串。在SpiderMonkey JavaScript 引擎中,這個字符串將會是"[‘object Object‘]"。
方法綁定
一個方法沒有綁定到對象上,那就意味著這個方法是不起作用的。特別要註意的是,在一個方法中this
對象並不是固定的,例如,this
不需要指向包含當前方法的對象。this
可通過函數調用被傳遞過去的值所替換。詳見方法綁定。
註意eval
JavaScript新手在使用eval時會犯錯,在那些可通過括號表示法替換的場景下。例如,下面的語法經常在很多代碼中找到。
x = eval(‘document.forms.form_name.elements.‘ + strFormControl + ‘.value‘);
eval
的性能較差,在任何時候都應該避免使用。而且,此時strFormControl
必須是一個合法的標識符, 這在一些names、IDs表單控件中並不是必要的。所以,最好是使用括號來代替:
x = document.forms["form_name"].elements[strFormControl].value;
屬性訪問器