JS祕密花園摘要

minmin520發表於2018-08-06

一、物件

物件的使用與屬性

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
複製程式碼

三、函式

相關文章