真是頭都看禿了才能把作業(yè)做完。JS對象這一部分的初步學(xué)習(xí)遇到了一些難點。其主要的問題集中在this是什么。這里對該部分寫一個簡單的記錄,理一理思路吧。
本文參考了很多別人的文章,不喜歡當(dāng)搬運工,基礎(chǔ)知識已經(jīng)有很多非常棒的博客了。
REF:
對象基礎(chǔ)
對象是一個包含相關(guān)數(shù)據(jù)和方法的集合(通常由一些變量和函數(shù)組成,我們稱之為對象里面的屬性和方法)
一個對象由許多的成員組成,每一個成員都擁有一個名字和一個值。每一個名字/值(name/value)對被逗號分隔開,并且名字和值之間由冒號(:)分隔
var objectName = {
member1Name : member1Value,
member2Name : member2Value,
member3Name : member3Value
}
創(chuàng)建對象的兩種方法
- 對象字面量 使用key/value的形式直接創(chuàng)建對象
var obj = {key: value};
這種方式直接通過花括號將對象的屬性包起來,使用key/value的方式創(chuàng)建對象屬性,每個屬性之間用逗號隔開。
注意:如果是最后一個屬性,后面就不要加逗號,因為在一些舊的瀏覽器下會報錯。
- 構(gòu)造函數(shù)(new關(guān)鍵字)
var o = new Object(); // 創(chuàng)建一個空對象,效果等同{}.
var d = new Date(); // 創(chuàng)建一個表示當(dāng)前時間的對象
var r = new RegExp("js"); // 創(chuàng)建一個正則表達式對象
點表示法(dot notation)
對象的名字表現(xiàn)為一個命名空間(namespace),當(dāng)你想訪問對象內(nèi)部的屬性或方法時,它必須寫在第一位,然后是一個點(.),緊接著是你想要訪問的項目,標(biāo)識可以是簡單屬性的名字(name),或者是數(shù)組屬性的一個子元素,又或者是對象的方法調(diào)用。
當(dāng)一個對象成員的值為另一個對象的時候,子對象的命名空間則為子命名空間。鏈?zhǔn)降狞c表示法可以達到訪問子命名空間的效果。
括號表示法(bracket notation)
對象有時被稱之為關(guān)聯(lián)數(shù)組(associative array)——對象做了字符串到值的映射,而數(shù)組做的是數(shù)字到值的映射。
括號表示法一個有用的地方是它不僅可以動態(tài)的去設(shè)置對象成員的值,還可以動態(tài)的去設(shè)置成員的名字。
obj[variableName] = value;
重點:this
-
像我一樣的Newbie對
this的理解很艱辛,我引用最后我理解的博文的兩句話來總結(jié)一下:this永遠指向最后調(diào)用它的那個對象,或者說點前面那個對象。
比如a.func()那么func的this就是a; a.b.c.d.f.e.func()的this就是e;
匿名函數(shù)的
this永遠指向window,或者說你找不到誰點了這個函數(shù),那么this代表的對象就是全局window
- 嚴格模式?jīng)]有window
前面沒有調(diào)用的對象那么就是全局對象 window,這就相當(dāng)于是 window.a();注意,這里我們沒有使用嚴格模式,如果使用嚴格模式的話,全局對象就是 undefined,那么就會報錯 Uncaught TypeError: Cannot read property 'name' of undefined
- 不會向上尋找
就算 a 中沒有 name 這個屬性,也不會繼續(xù)向上一個對象尋找 this.name,而是直接輸出 undefined
- 還有一個需要注意的就是,原始的對象以字典結(jié)構(gòu)保存,每一個屬性名都對應(yīng)一個屬性描述對象。例如
{foo: 5}
{
foo: {
[[value]]: 5
[[writable]]: true
[[enumerable]]: true
[[configurable]]: true
}
}
如果對象成員值為函數(shù),例如{foo: func(){}}那么其原始的對象其實是鏈接的函數(shù)地址。
{
foo: {
[[value]]: 函數(shù)地址
...
}
}
所以如果有將這個成員函數(shù)賦值給外部參數(shù),其實相當(dāng)與脫離了其對象的上下文環(huán)境直接從變量名指向了函數(shù)地址。
其他的別的博客寫得很棒了,直接去看鏈接吧。