標籤:
檢索
檢索一個並不存在的成員屬性的值,將返回undefined
flight.status //undefined
|| 運算子可以用來填充預設值
var status = flight.status || "unknown";
嘗試從undefined的成員屬性中取值,將會報錯TypeError。這時可以通過&&運算子來避免錯誤
flight.equipment //undefinedflight.equipment.model //Throw "TypeError"flight.equipment && flight.equipment.model //undefined
引用
對象通過引用來傳遞。他們永遠不會被複製。
var a = {}, b = {}, c = {}; //a,b,c每個都引用一個不同的Null 物件var a = b = c = {}; //a,b,c都引用同一個Null 物件
原型
如果我們嘗試去擷取對象的某個屬性值,但該對象並沒有此屬性名稱,那麼Javascript會試著從原型對象中擷取屬性值。
如果哪個原型對象也沒有該屬性,那麼再從它的原型中尋找。以此類推,直到最後到達終點 Object.prototype。
如果想要的屬性完全不存在於原型鏈中,那麼結果就是undefined值。
這個過程稱為委託。
反射
//反射機制指的是程式在運行時能夠擷取自身的資訊。
//如:一個對象能夠在運行時知道自己有哪些方法和屬性。
檢查對象並確定對象有什麼屬性是很容易的事情。
typeof操作符對確定屬性的類型很有協助:
typeof flight.number //‘number‘typeof flight.status //‘string‘typeof flight.manifest //‘undefined‘
注意原型鏈中的任意屬性都會產生值:
typeof flight.toString //‘function‘typeof flight.constructor //‘function‘
有兩種方法去處理這些不需要的屬性:
第一個是檢查並丟棄值為函數的屬性。
第二種是使用hasOwnProperty方法:
如果對象擁有專屬的屬性,它將返回true,hasOwnProperty方法不會檢查原型鏈。
flight.hasOwnProperty(‘number‘); //trueflight.hasOwnProperty(‘constructor‘); //false
枚舉
for in 語句可以枚舉所有的屬性——包括函數和原型中的屬性。最好用for代替之。
以特定順序枚舉對象的屬性:
var i;var properties = [ ‘first-name‘, ‘middle-name‘, ‘last-name‘, ‘profession‘];for(i=0; i<properties.length; i++){ document.writeln(properties[i] + ":" + another_stooge[properties[i]]);}
Javascript語言精粹