Javascript中,任何不是字串、數字、true、false、null或undefined的值都是物件。
物件是可變的,而且是通過參考(by reference)來操作,並非值(by value)。
雖然基本型別(字串、數字、布林)並非物件,但他們的行為表現就像是不可變物件。
Javascript物件種類可以廣泛分為三部分(Native, Host, 自訂義),以及兩種特性類型(Own, inherited)
物件種類
特性類型
用 new 運算子創造新物件的函式稱為建構式
每個物件都有關聯的protoype(原型)、class(類別)、extensible(可擴充)屬性。
所有用物件字面詞創建的物件都有同一個原型物件,Object.prototype
用new Object()
創建的物件繼承自Object.prototype
同樣的,使用new Array()
創建的物件繼承自Array.prototype
使用new Date()
創建的Date物件,同時繼承了Date.prototype
與Object.prototype
兩種特性,此一系列的原型物件就稱為原型鏈。
A = new Date(); // A同時繼承 Date.prototype 跟 Object.prototype兩者的特性
Object.prototype是少數沒有原型的物件。
Object.prevetExtensions()
。Object.isExtensible()
。object.property
:使用.識別字,識別字是靜態的,必須寫死object["property"]
:使用[字串],字串值是動態的,在執行其間可以改變,稱為關聯式陣列var A = { a:123 };
A.a === A["a"] // true 兩種方法是完全一樣的
delete
運算子從物件中刪除特性,delete
是作用在特性本身,非值之上
var o = {};
var a = { x:10 };
o.a = a;
delete o.a;
o.a // undefined
a.x // 10 → a沒有被刪除
var o = {x:1};
"x" in o; //true
也可以用是否為undefined
代替
var o = {x:1};
o.x !== undefined; //true
//不過如果是 o = {x:undefined} , 就要用in了
以下定義了幾個工具函式,使用for/in迴圈操作物件特性,
由其是extend()
函式,常會在Javascript工具程式庫中看到。
var A = {a:1, b:2, c:3};
var B = {a:123};
// extend(B, A);
// 把 A 特性複製到 B,共同的特性名稱會被蓋掉
function extend(o, p) {
for(var prop in p) {
o[prop] = p[prop];
}
return o;
}
// merge(B, A);
// 把 A 特性複製到 B,共同特性名稱維持不變
function merge(o, p) {
for(var prop in p) {
if (o.hasOwnProperty(prop)) continue;
o[prop] = p[prop];
}
return o;
}
// restrict(A, B);
// 刪除 A 的特性,除了 AB 共同特性
function restrict(o, p) {
for(var prop in o) {
if ( !(prop in p) ) delete o[prop];
}
return o;
}
// substract(A, B);
// 刪除 A 和 B 共同的特性
function substract(o, p) {
for(var prop in p) {
delete o[prop];
}
return o;
}
// union(A, B)
// 回傳一個新物件,他擁有 AB 兩者的特性
// 如果 AB 有共同特性,就用 B 的特性值
function union(o, p) {
return extend( extend({}, o), p );
}
// instersection(A, B)
// 回傳一個新物件,他擁有 AB 共同特性
// 但 B 特性值會被丟棄
function instersection(o, p) {
return restrict( extend({}, o), p );
}
// keys(A)
// 回傳一個陣列,内有 o 所有的可列舉的自有特性名稱
function keys(o) {
if (typeof o !== "object") throw TypeError();
var result = [];
for(var prop in o) {
if (o.hasOwnProperty(prop))
result.push(prop);
}
return result;
}
一個物件的特性是由一個名稱、一個值,以及一組屬性所構成。 在ES5之後,每個特性都有4個屬性
把物件轉為字串。
toString()
方法不取引數,它在物件上調用,回傳表示該物件值的字串。
每當Javascript需要把某物件轉為字串時,它就會在那個物件上調用這方法,例如使用+運算子來串接字串與物件時。
資料來源:
JavaScript大全(第六版)