語法
對象對于我們來說已經(jīng)十分熟悉,比如常說的面向?qū)ο缶幊?,在業(yè)務(wù)開發(fā)中盡量使用對象化邏輯等等,那么JavaScript中的對象有著怎樣的屬性特點呢?接下來我們來一起學(xué)習(xí)和討論一下:
js中對象的常見創(chuàng)建方式有兩種:字面量和構(gòu)造形式
字面量:這種方法因為表格直觀、添加字段比較靈活,所以經(jīng)常會用這種方法。
var myobj = {
? ? ?name:value,
? ? ? ...
}
構(gòu)造法:這種方法用的比較少。
var myobj = new Object();
myobj.name = value;
從上面的表現(xiàn)形式看,對象其實就是鍵值對的組合了。
類型
JavaScript中有哪幾種類型嗎?不知道的就要記住了,可能面試的時候會被問到??偣灿?個,它們分別是string、number、boolean、null、undefined、object,對象只是這幾個類型之一。所以那句“JavaScript中萬物皆是對象”話顯然是錯誤的。
內(nèi)置對象
JavaScript中還有一些對象子類型,被稱之為內(nèi)置對象,它們看起來和基本類型很像,但實際上它們更加復(fù)雜,總共有10個,分別是Sting、Number、Boolean、Object、Function、Array、Date、Regexp、Error。這些內(nèi)置對象其實很像C++語言中的類,而上面的基本類型倒是有些像變量的類型。但是實際上,這些內(nèi)置對象其實就是內(nèi)置函數(shù),可以通過函數(shù)構(gòu)造的方法創(chuàng)建一個子類型的新對象??聪旅娴拇a:
?var mystring = "i am a string";
?var type =? typeof mystring;? //"string"
?var isstring = mystring instanceof String; //false
這里的 mystring就是一個字面量,是一個不可變的值,如果想獲取其長度、訪問其中某個字符操作的話,要把其轉(zhuǎn)化我String對象。這時候有些同學(xué)便站出來反駁道:平時我自己定義一個字符串變量后,是可以直接獲取其長度的:var length = mystring.length; 表面上是這樣的,但實際上,JavaScript引擎已經(jīng)自動將字面量轉(zhuǎn)化為String對象了。同樣的事情也會發(fā)生在數(shù)字字面量上。null和undefined沒有構(gòu)造形式,只有字面量形式,相反,Date只有構(gòu)造,沒有文字形式。對于Object、Array、Function、RegExp,無論它們是字面量,還是構(gòu)造形式,其實它們都是對象。
主要內(nèi)容
說到對象的內(nèi)容,其實就是對象里面的屬性所指向的值。訪問這些值的方法通常有兩種:屬性訪問和鍵訪問,通過?. 操作的為“屬性訪問”,通過 [ ] 訪問的叫做”鍵訪問“。實際上它們訪問的是同一個位置,這兩個有什么區(qū)別呢?. 操作要求屬性名要滿足標(biāo)識符的命名規(guī)范,['..'] 操作符可以接受任意的 UTF-8/Unicode字符串作為屬性名。舉個例子,要引用“my-fun!”這樣一個屬性名,就只能用鍵訪問了,因為它不并不是一個有效的標(biāo)識符名。
對象的屬性名永遠(yuǎn)是一個字符串,如果你用string之外的類型作為屬性名的話,系統(tǒng)也會自動將其轉(zhuǎn)化為string類型。
1、可計算屬性名
在平時的業(yè)務(wù)開發(fā)中,可能你會想用表達(dá)式來動態(tài)的表達(dá)屬性名,那么剛才的 myobject[..] 就顯示出了的優(yōu)勢了,比如我們可以這樣寫:myobject[ first+ middle + last] 。ES6增加了可計算屬性名,可以在文字表達(dá)式中用 [ ] 包裹一個表達(dá)式來作為屬性名。
? ? var first = 'first_';
? ? var myobject = {
? ? ? ? ?[first + 'friend']:'wangjie',
? ? ? ? ?[first + 'movie']:'transform'
? ? }
? ? console.log(myobject["first_friend"]); //wangjie
? ? console.log(myobject["first_movie"]);? //transform
2、數(shù)組
說到數(shù)組,我想大家一定覺得自己很了解了,畢竟經(jīng)常用。前面說到過數(shù)組也是對象,那么我們平時有把其當(dāng)做對象來思考或是運(yùn)用嗎?數(shù)組有著自己的數(shù)值存儲機(jī)制,訪問是通過數(shù)字下標(biāo)來進(jìn)行的。
? ? var myarry = ['me',30,'you'];
? ? console.log(myarry.length); //3
? ? console.log(myarry[0]);//me
? ? console.log(myarry[3]);//undefined
有人可能會問,既然數(shù)組是對象,那么是否可以通過?.?的方法或是?[ ]?方法給數(shù)組添加一個屬性?答案是肯定的,看看下面這段代碼:
? ? var myarry = ['me',30,'you'];
? ? myarry.type = 'object';
? ? myarry['name'] = 'myself';
? ? console.log(myarry.length); //3
? ? console.log(myarry[0]);//me
? ? console.log(myarry.type);//object
? ? console.log(myarry.name);//myself
我們向數(shù)組 myarry 中添加了兩個屬性,但是數(shù)組的長度并沒有變,所以我們完全可以把數(shù)組當(dāng)做對象使用。不過這里注意的一點是,如果向數(shù)組中添加一個類似數(shù)字的屬性時,這個屬性會變成數(shù)組下標(biāo),那么數(shù)組的內(nèi)容和長度將會發(fā)生變化。
? ? var myarry = ['me',30,'you'];
? ? myarry.type = 'object';
? ? myarry['0'] = 'other';
? ? myarry['3'] = 'myself';
? ? console.log(myarry.length); //4
? ? console.log(myarry[0]);//other
? ? console.log(myarry[3]);//myself
好吧,寫到這里的時候發(fā)現(xiàn)已經(jīng)1400字了,雖然下面還有關(guān)于對象復(fù)制、getter和setter的介紹,但是由于篇幅的原因,總不能違背簡書提倡的簡的原則,而且寫的太多也會影響讀者朋友的吸收,所以剩下的內(nèi)容就放在下一篇討論吧。