[JS] 關於物件

JavaScript的簡單型別裡,包括了數值字串booleannullundefined。其它所有的值都是物件(object)。
陣列是物件、函式是物件、正規式是物件…都是物件。

物件是特性(Property)的容器,具有名稱與值。

物件實字(object literal)

物件實字提供一種建立新物件值的便利註記方式。是以一對大括號圍起的零或多對名稱/值(name/value)。

//例:
var your_name = {};

var your _name2 = {
  "first_name": "Carlos",
  "last_name": "Chang"
};

var flight = {
  airline: "Oceanic",
  number: 815,
  departure:{
    IATA: "SYD",
    time: "2004-09-22 14:55",
    city: "Sydney"
  },
  arrival:{
    IATA: "LAX",
    time: "2004-09-23 10:42",
    city: "Los Angeles"
  }
};

擷取

擷取的方式可用[](中括號)或.(點號)的方式來取值:

//例:
your_name2['first_name']  // "Carlos"
flight.departure.IATA     // "SYD"

//例:||字算子能用於填入預設值:
var middle = your_name2["middle_name"] || "(none)";
var status = flight.status || "unknown";

更新

物件裡的值,可透過指派來直接更新。

//例:如果物件裡已有特性名稱,則會取代特性值:
your_name2["first_name"] = "Duncan";

//例:如果物件裡還沒有特性名稱,則會增加到物件裡:
your_name2["middle_name"] = "Lester";
your_name2.nickname = "Curly";

flight.equipment = {
  model: 'Boeing 777'
};
flight.status = 'overdue';

參考

物件是透過參考(reference)而被傳遞。

//例:a、b、c各自參考到不同物件
var a = {}, b = {}, c = {};

//例:a、b、c均參考到同一個空物件
var a = b = c {};

原型

每個物件都聯繫到一個prototype物件,由此可繼承特性。所有從物件實字建立的物件,都聯繫到Object.prototype(JavaScript的標準物件)

反映

typeof運算子在判斷特性的型別時很有幫助。

typeof flight.number    // 'number'
typeof flight.status    // 'string'
typeof flight.arrival   // 'object'
typeof flight.manifest  // 'undefined'

//因為任何原型鍊上的特性都可產生值,例:
typeof flight.toString     // 'function',由prototype來的
typeof flight.constructor  // 'function',由prototype來的

//可用hasOwnProperty方法,在物件擁有指定特性時回傳true:
flight.hasOwnProperty('number')       // true
flight.hasOwnProperty('constructor')  // false

列舉

for in敘述,可用迴圈處理所有物件中的特性名稱。列舉(enumeration)將包括所有特性–甚至包括你沒興趣的函式特性、原型特性,所以需要過濾不需要的值。最常見的過濾器是hasOwnProperty方法,加上排除函式的typeof

var name;
for(name in another_your_name2){
  if(typeof another_your_name2[name] !== 'function'){
    document.writeln(name + ': ' + your_name2[name]);
  }
}

//名稱的順序沒有保證,如果想確保特性依照特定順序出現,最好完全別用for in敘述;請改為使用陣列,依照正確順序儲存特性名稱,並用for取代for in,如此也不用在原型鏈上大海撈針:
var i;
var properties = [
  'first_name',
  'middle_name',
  'last_name',
  'profession'
];
for(i = 0; i < properties.length: i += 1){
  document.writeln(properties[i] + ': ' your_name2[properties[i]]);
}

刪除

delete運算子可從物件中移除特性。如果物件裡有該特性,則移除,且不會影響原型聯繫(prototype linkage)裡的其它物件。

your_name2.nickname // 'Curly'
delete your_name2.nickname;

減少全域變數

減少全域變數的使用至最小化的其中一種方式,就是為應用程式建立唯一一個全域變數:

var MYAPP = {};

MYAPP.your_name2 = {
  "first_name": "Carlos",
  "last-name": "Chang"
};

MYAPP.flight = {
  airline: "Oceanic",
  number: 815,
  departure:{
    IATA: "SYD",
    time: "2004-09-22 14:55",
    city: "Sydney"
  },
  arrival:{
    IATA: "LAX",
    time: "2004-09-23 10:42",
    city: "Los Angeles"
  }
};

全域變數減少到單一名稱後,也顯著地降低與其他應用程式發生錯誤互動的風險了。

 

參考資料:”JavaScript優良部份”一書