JavaScript中對(duì)象property的讀取和寫入方法介紹
JavaScript中,可以通過點(diǎn)號(hào)操作符”.”或者中括號(hào)操作符”[]“來對(duì)對(duì)象的property進(jìn)行讀取和寫入:
var o = {x:1, y:2};
console.log(o.x);//1
console.log(o["y"]);//2
o.y = 7;
console.log(o["y"]);//7
值得注意的是,如果使用中括號(hào)操作符,則操作符內(nèi)的值類型必須是string,或者能夠轉(zhuǎn)換成string的表達(dá)式:
console.log(o[y]);//ReferenceError: y is not defined
var v = "y";
console.log(o[v]);//7
與Java語言不同的是,JavaScript中對(duì)象的property可以動(dòng)態(tài)添加或刪除。當(dāng)對(duì)某個(gè)property進(jìn)行賦值操作時(shí),如果該property不存在,JavaScript會(huì)在對(duì)象中動(dòng)態(tài)添加此property:
o.z = 99;
console.log(o);//Object {x=1, y=7, z=99}
原型繼承鏈中property的讀取
JavaScript中所有的對(duì)象均有一個(gè)prototype原型對(duì)象,并從該原型對(duì)象中繼承property;因此,JS中一個(gè)對(duì)象的property分成兩大類:
1.對(duì)象自身所擁有的property(“Own Property”)。
2.從原型對(duì)象處繼承而來的property。
當(dāng)讀取對(duì)象的property時(shí),所遵循的規(guī)則如下:
1.從對(duì)象自身的property集合(“Own Property”)中搜索需要讀取的property;如果可以搜索到,則直接讀取該property并返回其值。
2.如果無法從對(duì)象自身的property集合(“Own Property”)中搜索到該property,那么則從對(duì)象的prototype原型鏈中繼續(xù)進(jìn)行搜索,直至搜索到該property并返回其值。
3.如果無法從對(duì)象自身的property集合(“Own Property”)中搜索到該property,也無法從對(duì)象的所有prototype對(duì)象中搜索到該property,則返回undefined。
原型繼承鏈中property的寫入
在對(duì)JavaScript對(duì)象的property進(jìn)行寫入時(shí),所遵循的規(guī)則如下:
1.如果對(duì)象自身有該property,且該property可寫,則將新值寫入該property。如果該property只讀,則報(bào)錯(cuò)。
2.如果對(duì)象自身沒有該property,且其所有的prototype對(duì)象中也不存在該property,則將此property添加到該對(duì)象中。
3.如果對(duì)象自身沒有該property,但其prototype對(duì)象中存在該property且可寫,那么JS會(huì)在對(duì)象中新建這個(gè)property;也就是說,該對(duì)象覆寫了其prototype對(duì)象中的這個(gè)property。prototype對(duì)象中此property值不變。
4.如果對(duì)象自身沒有該property,但其prototype對(duì)象中存在該property且只讀,則報(bào)錯(cuò)。
5.如果對(duì)象自身沒有該property,但其prototype對(duì)象中存在該property的setter方法,那么JS會(huì)調(diào)用該prototype對(duì)象中的setter方法。值得注意的是,在運(yùn)行setter方法時(shí),如果涉及到變量賦值,那么賦值操作將作用在對(duì)象自身上,而prototype對(duì)象不會(huì)有任何改動(dòng)。對(duì)于這一行為,可以理解為:對(duì)象從prototype處繼承了setter函數(shù)并加以執(zhí)行。
從上述規(guī)則中可以發(fā)現(xiàn),如果對(duì)property的賦值操作成功,那么最后被修改的永遠(yuǎn)是對(duì)象自身,其prototype原型對(duì)象不會(huì)有任何改動(dòng)。
相關(guān)文章
js實(shí)現(xiàn)的簡(jiǎn)練高效拖拽功能示例
這篇文章主要介紹了js實(shí)現(xiàn)的簡(jiǎn)練高效拖拽功能,通過對(duì)js鼠標(biāo)事件的擴(kuò)展實(shí)現(xiàn)拖拽效果,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-12-12
純JS實(shí)現(xiàn)旋轉(zhuǎn)圖片3D展示效果
本文給大家分享的是純js實(shí)現(xiàn)的類似flash里的圖片環(huán)繞旋轉(zhuǎn)效果,非常炫酷,有需要的小伙伴可以參考下。2015-04-04
JS實(shí)現(xiàn)數(shù)組去重及數(shù)組內(nèi)對(duì)象去重功能示例
這篇文章主要介紹了JS實(shí)現(xiàn)數(shù)組去重及數(shù)組內(nèi)對(duì)象去重功能,結(jié)合實(shí)例形式分析了ES5與ES6兩種版本針對(duì)數(shù)組去重的相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
js實(shí)現(xiàn)快速分享功能(你的文章分享工具)
這是一款簡(jiǎn)單易用的文章分享工具,您只需將下面的html代碼拷貝到模板中就可以實(shí)現(xiàn)文章快速分享功能,具體的實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助2013-06-06
javascript里模擬sleep(兩種實(shí)現(xiàn)方式)
有幾種方式,但都不完美 其一:不斷循環(huán),直到達(dá)到指定時(shí)間、其二:用xhr同步請(qǐng)求后臺(tái)程序,比如傳2000過去,后臺(tái)就sleep 2秒后再返回,這種方式也有缺點(diǎn),當(dāng)N多客戶端都請(qǐng)求后臺(tái)時(shí),一直保持連接http開銷很大,感興趣的朋友可以了解下啊2013-01-01
javascript巧用eval函數(shù)組裝表單輸入項(xiàng)為json對(duì)象的方法
這篇文章主要介紹了javascript巧用eval函數(shù)組裝表單輸入項(xiàng)為json對(duì)象的方法,實(shí)例分析了JavaScript使用eval函數(shù)動(dòng)態(tài)構(gòu)造json對(duì)象的相關(guān)技巧,需要的朋友可以參考下2015-11-11
JS實(shí)現(xiàn)的簡(jiǎn)易拖放效果示例
這篇文章主要介紹了JS實(shí)現(xiàn)的簡(jiǎn)易拖放效果的方法,涉及JS事件監(jiān)聽、擴(kuò)展及頁面元素動(dòng)態(tài)操作的相關(guān)技巧,需要的朋友可以參考下2016-12-12

