你必須了解的JavaScript中的屬性描述對(duì)象詳解(上)
屬性描述對(duì)象
JavaScript其實(shí)支持多種編程范式的,包括函數(shù)式編程和面向?qū)ο缶幊蹋?/p>
- JavaScript沖的對(duì)象被設(shè)計(jì)為一組屬性無(wú)序集合,像是一個(gè)嘻哈表,由key和value組成;
- key是一個(gè)標(biāo)識(shí)符名稱(chēng),value可以是任意類(lèi)型,也可以是其他對(duì)象或者函數(shù)類(lèi)型;
- 如果值是一個(gè)函數(shù),那么我們可以稱(chēng)之為對(duì)象的方法。
所以,屬性描述對(duì)象的概念就為:JavaScript提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來(lái)描述對(duì)象的屬性,控制它的行為,比如該屬性是否可寫(xiě)、可遍歷等等。這個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)稱(chēng)為“屬性描述對(duì)象”(attributes object)。每個(gè)屬性都有自己對(duì)應(yīng)的屬性描述對(duì)象,保存該屬性的一些元信息。
下面是屬性描述對(duì)象的一個(gè)例子。
{ value:123, writable:false, enumerable:true, configurable:false, get:undefined, set:undefined }
屬性描述對(duì)象提供六個(gè)元屬性。
value
:value
是該屬性的屬性值,默認(rèn)為undefined
。writable
:writable
是一個(gè)布爾值,表示屬性值(value)是否可改變(即是否可改寫(xiě)),默認(rèn)為true
。enumerable
:enumerable
是一個(gè)布爾值,表示該屬性是否可遍歷,默認(rèn)為true
。如果設(shè)為false
,會(huì)使得某些操作(比如for...in
循環(huán)、Object.keys()
)跳過(guò)該屬性。configurable
:configurable
是一個(gè)布爾值,表示可配置性,默認(rèn)為true
。如果設(shè)為false
,將阻止某些操作改寫(xiě)屬性,比如無(wú)法刪除該屬性,也不得改變?cè)搶傩缘膶傩悦枋鰧?duì)象(value
屬性除外)。也就是說(shuō),configurable
屬性控制了屬性描述對(duì)象的可寫(xiě)性。get
:get
是一個(gè)函數(shù),表示該屬性的取值函數(shù)(getter),默認(rèn)為undefined
。set
:set
是一個(gè)函數(shù),表示該屬性的存值函數(shù)(setter),默認(rèn)為undefined
。
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptor()
方法可以獲取屬性描述對(duì)象。他的第一個(gè)參數(shù)是目標(biāo)對(duì)象,第二個(gè)參數(shù)是一個(gè)字符串,對(duì)應(yīng)目標(biāo)對(duì)象的某個(gè)屬性名。
var obj = (p:'a'}; Object.getOwnPropertyDescriptor(obj,'p') //Object{ value:"a", // writable:true, // enumerable:true, // configurable:true }
上面代碼中,Object.getOwnPropertyDescriptor()
方法獲取obj.p
的屬性描述對(duì)象。
注意,Object.getOwnPropertyDescriptor()
方法只能用于對(duì)象自身的屬性,不能用于繼承的屬性。
var obj = {p:'a'); Object.getOwnPropertyDescriptor(obj,'toStrng') //undefined
上面代碼中,toString
是obj
對(duì)象繼承的屬性,Object.getOwnPropertyDescriptor()
無(wú)法獲取。
Object.getOwnPropertyNames()
Object.getOwnPropertyNames
方法返回一個(gè)數(shù)組,成員是參數(shù)對(duì)象自身的全部屬性的屬性名,不管該屬性是否可遍歷。
var obj = Object.defineProperties({},{ p1:{value:1,enumerable:true}, p2:{value:2,enumerable:false} }); Object.getOwnPropertyNames(obj) //["p1","p2"]
上面代碼中,obj.p1
是可遍歷的,obj.p2
是不可遍歷的。Object.getOwnPropertyNames
會(huì)將它們都返回。
這跟Object.keys
的行為不同,Object.keys
只返回對(duì)象自身的可遍歷屬性的全部屬性名。
Object.keys([])//[] Object.getOwnPropertyNmaes([])//['length'] Object.keys(Object.prototype)// [] Object.getOwnPropertyNames(Object.prototype) //['hasOwmProperty' // 'valueOf', // 'constructor', // 'toLocaleString', // 'isPrototypeOf', // 'propertyIsEnumerable', // 'toString']
上面代碼中,數(shù)組自身的length
屬性是不可遍歷的,Object.keys
不會(huì)返回該屬性。第二個(gè)例子Object.prototype
也是一個(gè)對(duì)象,所有實(shí)例對(duì)象都會(huì)繼承它,它自身的屬性都是不可遍歷的。
Object.defineProperty(),Object.defineProperties()
Object.defineProperty()
方法允許通過(guò)屬性描述對(duì)象,定義或修改一個(gè)屬性,然后返回修改后的對(duì)象,它的用法如下。
Object.defineProperty(object,propertyName,attributesObject)
Object.defineProperty
方法接受三個(gè)參數(shù),依次如下。
- object:屬性所在的對(duì)象
- propertyName:字符串,表示屬性名
- attributesObject:屬性描述對(duì)象
舉例來(lái)說(shuō),定義obj.p
可以寫(xiě)成下面這樣。
var obj = Object.defineProperty({},'p',{ value:123, writable:false, enumerable:true, configurable:false }); obj.p //123 obj.p = 246; obj.p //123
上面代碼中,Object.defineProperty()
方法定義了obj.p
屬性。由于屬性描述對(duì)象的writable
屬性為false
,所以obj.p
屬性不可寫(xiě)。注意,這里的Object.defineProperty
方法的第一個(gè)參數(shù)是{}
(一個(gè)新建的空對(duì)象),p
屬性直接定義在這個(gè)空對(duì)象上面,然后返回這個(gè)對(duì)象,這是Object.defineProperty()
的常見(jiàn)用法。
如果屬性已經(jīng)存在,Object.defineProperty()
方法相當(dāng)于更新該屬性的屬性描述對(duì)象。
如果一次性定義或修改多個(gè)屬性,可以使用Object.defineProperties()
方法。
var obj = Object.defineProperties({},{ p1:{value:123,enumerable:true}, p2:{value:'abc',enumerable:true}, p3:{get:function(){return this.p1 + this.p2}, enumerable:true, configurable:true } }); obj.p1 //123 obj.p2 //"abc" obj.p3 //"123abc"
上面代碼中,Object.defineProperties()
同時(shí)定義了obj
對(duì)象的三個(gè)屬性。其中,p3
屬性定義了取值函數(shù)get
,即每次讀取該屬性,都會(huì)調(diào)用這個(gè)取值函數(shù)。
注意,一旦定義了取值函數(shù)get
(或存值函數(shù)set
),就不能將writable
屬性設(shè)為true
,或者同時(shí)定義value
屬性,否則會(huì)報(bào)錯(cuò)。
var obj = {}; Object.defineProperty(obj,'p',{ value:123, get:function(){return 456;} }); //TypeError: Invalid property. // A property cannot both have accessors and be writable or have a value Object.defineProperty(obj,'p'{ writable:true, get:function(){return 456;} }); // TypeError: Invalid property descriptor. // Cannot both specify accessors and a value or writable attribute
上面代碼中,同時(shí)定義了get
屬性和value
屬性,以及將writable
屬性設(shè)為true
,就會(huì)報(bào)錯(cuò)。
Object.defineProperty()
和Object.defineProperties()
參數(shù)里面的屬性描述對(duì)象,writable
、configurable
、enumerable
這三個(gè)屬性的默認(rèn)值都為false
。
var obj = {}; Object.defineProperty(obj,'foo',{}); Object.getOwnPropertyDescriptor(obj,'foo') //{ // value:undefined, // writable:false, // enumerable:false, // configurable:false //}
上面代碼中,定義obj.foo
時(shí)用了一個(gè)空的屬性描述對(duì)象,就可以看到各個(gè)元屬性的默認(rèn)值。
Object.prototype.propertyIsEnumerable()
實(shí)例對(duì)象的propertyIsEnumerable()
方法返回一個(gè)布爾值,用來(lái)判斷某個(gè)屬性是否可遍歷。注意,這個(gè)方法只能用于判斷對(duì)象自身的屬性,對(duì)于繼承的屬性一律返回false
。
var obj = {}; obj.p = 123; obj.propertyIsEnumerable('p') //true obj.propertyIsEnumerable('toString') //false
上面代碼中,obj.p
是可遍歷的,而obj.toString
是繼承的屬性。
到此這篇關(guān)于你必須了解的JavaScript中的屬性描述對(duì)象詳解(上)的文章就介紹到這了,更多相關(guān)JavaScript屬性描述對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 獲得Javascript對(duì)象屬性個(gè)數(shù)的示例代碼
- 詳解js對(duì)象中屬性的兩種類(lèi)型之?dāng)?shù)據(jù)屬性和訪(fǎng)問(wèn)器屬性
- js數(shù)組對(duì)象里面如何獲取某個(gè)屬性值相等的對(duì)象
- JS如何刪除對(duì)象中的某一屬性(delete)
- 你必須了解的JavaScript中的屬性描述對(duì)象詳解(下)
- js刪除對(duì)象屬性的多種方法舉例
- js 如何刪除對(duì)象里的某個(gè)屬性
- Javascript中判斷對(duì)象是否具有屬性的5種方法分享
- JS 實(shí)現(xiàn)獲取對(duì)象屬性個(gè)數(shù)的方法小結(jié)
相關(guān)文章
javascript實(shí)現(xiàn)圖像循環(huán)明暗變化的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)圖像循環(huán)明暗變化的方法,實(shí)例分析了javascript操作css樣式的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02js實(shí)現(xiàn)瀑布流效果(自動(dòng)生成新的內(nèi)容)
本文主要介紹了js實(shí)現(xiàn)瀑布流效果:當(dāng)滾動(dòng)條接近底部會(huì)自動(dòng)生成新的內(nèi)容。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03webpack 如何解析代碼模塊路徑的實(shí)現(xiàn)
這篇文章主要介紹了webpack 如何解析代碼模塊路徑的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09谷歌瀏覽器不支持showModalDialog模態(tài)對(duì)話(huà)框的解決方法
谷歌瀏覽器不支持showModalDialog模態(tài)對(duì)話(huà)框和無(wú)法返回returnValue,這個(gè)問(wèn)題,想必很多朋友都有遇到過(guò)吧,解決方法很簡(jiǎn)單,下面的思路,大家可以看看2014-09-09詳解JavaScript調(diào)用棧、尾遞歸和手動(dòng)優(yōu)化
本篇文章主要介紹了詳解JavaScript調(diào)用棧、尾遞歸和手動(dòng)優(yōu)化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06JavaScript判斷一個(gè)變量是否是數(shù)組的五種方式總結(jié)
在 JavaScript 編程中,我們經(jīng)常需要對(duì)不同類(lèi)型的變量進(jìn)行判斷和處理,其中,判斷一個(gè)變量是否是數(shù)組是一項(xiàng)基本且常見(jiàn)的任務(wù),在本篇博客中,我們將介紹幾種常用的方式來(lái)判斷一個(gè)變量是否是數(shù)組,并探討它們的優(yōu)缺點(diǎn)以及適用場(chǎng)景,需要的朋友可以參考下2023-11-11JavaScript中的this指向綁定規(guī)則及常見(jiàn)面試總結(jié)
這篇文章主要為大家介紹了JavaScript中的this指向綁定規(guī)則及箭頭韓碩中的this指向,還b包含了常見(jiàn)面試總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12基于p5.js 2D圖像接口的擴(kuò)展(交互實(shí)現(xiàn))
這篇文章主要為大家詳細(xì)介紹了基于p5.js 2D圖像接口的擴(kuò)展,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11javascript實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03JS數(shù)組方法concat()用法實(shí)例分析
這篇文章主要介紹了JS數(shù)組方法concat()用法,結(jié)合實(shí)例形式分析了JS數(shù)組concat()方法具體功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-01-01