深刻淺出JavaScript:面向對象編程之對象

理解對象

每個對象都是基於引用類型建立的。工具

一個對象就是一個屬性集合,並擁有一個獨立的prototype(原型)對象。
這個prototype能夠是一個對象(所謂它的原型對象)或者null(原型鏈終點)。spa

栗子:foo,兩個明顯的自身屬性(x,y)和一個隱含的__proto__屬性,這個屬性是對foo
原型對象的引用:prototype

Paste_Image.png

對象做爲數據類型

JavaScript 的對象能夠做爲哈希表使用,主要用來保存命名的鍵與值的對應關係。
使用對象的字面語法{}能夠建立一個簡單對象。這個新建立的對象從Object.prototype繼承下面,沒有任何自定義屬性。設計

var foo = {}; // 一個空對象
// 一個新對象,擁有一個值爲12的自定義屬性'test'
var bar = {test: 12};

訪問屬性

有兩種方式來訪問對象的屬性,點操做符或者中括號操做符。code

var foo = {name: 'kitten'}
foo.name; // kitten
foo['name']; // kitten
var get = 'name';
foo[get]; // kitten
foo.1234; // SyntaxError
foo['1234']; // works

兩種語法是等價的,可是中括號操做符在下面兩種狀況下依然有效對象

  • 動態設置屬性繼承

  • 屬性名不是一個有效的變量名ip

在 JSLint 語法檢測工具中,點操做符是推薦作法。原型鏈

刪除屬性

刪除屬性的惟一方法是使用 delete操做符;
設置屬性爲 undefined或者null並不能真正的刪除屬性,而僅僅是移除了屬性和值的關聯。字符串

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
只有baz被真正的刪除了,因此從輸出結果中消失。

屬性名的語法

var test = {    'case': 'I am a keyword so I must be notated as a string',    delete: 'I am a keyword too so me' // 出錯:SyntaxError};

對象的屬性名可使用字符串或者普通字符聲明。可是因爲 JavaScript 解析器的另外一個錯誤設計,上面的第二種聲明方式在ECMAScript5以前會拋出SyntaxError的錯誤。

這個錯誤的緣由是delete是JavaScript語言的一個關鍵詞;所以爲了在更低版本的 JavaScript 引擎下也能正常運行, 必須使用字符串字面值聲明方式。

JavaScript 中全部變量均可以看成對象使用,除了兩個例外null和undefined

提問!!! 數字能夠做文對象來使用嗎? 2.toString();會輸出什麼???

特殊的栗子
一個常見的誤解是數字的字面值(literal)不能看成對象使用。
這是由於 JavaScript 解析器的一個錯誤, 它試圖將點操做符解析爲浮點數字面值的一部分。

2.toString(); // 出錯:SyntaxError

有不少變通方法可讓數字的字面值看起來像對象。

2..toString(); // 第二個點號能夠正常解析
2 .toString(); // 注意點號前面的空格
(2).toString(); // 2先被計算
相關文章
相關標籤/搜索