一、物件
物件的使用與屬性
JS中所有的變數都可以當物件使用,除了兩個例外null和undefined。
false.toString(); // 'false'
[1, 2, 3].toString(); // '1,2,3'
function Foo(){}
Foo.bar = 1;
Foo.bar; // 1
複製程式碼
數字的字面量不能當物件。
2.toString(); // 出錯:SyntaxError
複製程式碼
物件作為資料型別,使用{}建立一個簡單的物件,這個新建立的物件從Object.prototype繼承下面,沒有任何自定義屬性。
var foo = {}; // 一個空物件
// 一個新物件,擁有一個值為12的自定義屬性'test'
var bar = {test: 12};
複製程式碼
訪問物件的屬性
var foo = {name: 'kitten'}
foo.name; // kitten
foo['name']; // kitten
var get = 'name';
foo[get]; // kitten
foo.1234; // SyntaxError
foo['1234']; // works
複製程式碼
刪除屬性:刪除屬性唯一方法是delete操作符
var obj = {
bar: 1,
foo: 2,
baz: 3
};
obj.bar = undefined;
obj.foo = null;
delete obj.baz;
for(var i in obj) {
if (obj.hasOwnProperty(i)) {
console.log(i, '' + obj[i]);
}
}
輸出bar undefined和foo null
複製程式碼
二、原型
判斷一個物件是否包含自定義屬性而不是原型鏈上的屬性,我們需要使用繼承自Object.prototype的hasOwnPrototype方法。
// 修改Object.prototype
Object.prototype.bar = 1;
var foo = {goo: undefined};
foo.bar; // 1
'bar' in foo; // true
foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true
複製程式碼
JS不會保護hasOwnProperty作為屬性被非法佔用,因此如果一個物件碰巧存在這個屬性,就需要外部的hasOwnProperty函式來獲取正確的結果。
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 總是返回 false
// 使用其它物件的 hasOwnProperty,並將其上下文設定為foo
({}).hasOwnProperty.call(foo, 'bar'); // true
複製程式碼