最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

你必須了解的JavaScript中的屬性描述對(duì)象詳解(上)

 更新時(shí)間:2022年12月22日 14:00:10   作者:程序小猿2  
JavaScript提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來(lái)描述對(duì)象的屬性,控制它的行為,比如該屬性是否可寫、可遍歷等等。這個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)稱為“屬性描述對(duì)象”。本文主要帶大家了解一下JavaScript中你必須了解的屬性描述對(duì)象,需要的可以參考一下

屬性描述對(duì)象

JavaScript其實(shí)支持多種編程范式的,包括函數(shù)式編程和面向?qū)ο缶幊蹋?/p>

  • JavaScript沖的對(duì)象被設(shè)計(jì)為一組屬性無(wú)序集合,像是一個(gè)嘻哈表,由key和value組成;
  • key是一個(gè)標(biāo)識(shí)符名稱,value可以是任意類型,也可以是其他對(duì)象或者函數(shù)類型;
  • 如果值是一個(gè)函數(shù),那么我們可以稱之為對(duì)象的方法。

所以,屬性描述對(duì)象的概念就為:JavaScript提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來(lái)描述對(duì)象的屬性,控制它的行為,比如該屬性是否可寫、可遍歷等等。這個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)稱為“屬性描述對(duì)象”(attributes object)。每個(gè)屬性都有自己對(duì)應(yīng)的屬性描述對(duì)象,保存該屬性的一些元信息。

下面是屬性描述對(duì)象的一個(gè)例子。

{
    value:123,
    writable:false,
    enumerable:true,
    configurable:false,
    get:undefined,
    set:undefined
}    

屬性描述對(duì)象提供六個(gè)元屬性。

  • valuevalue是該屬性的屬性值,默認(rèn)為undefined
  • writablewritable是一個(gè)布爾值,表示屬性值(value)是否可改變(即是否可改寫),默認(rèn)為true。
  • enumerableenumerable是一個(gè)布爾值,表示該屬性是否可遍歷,默認(rèn)為true。如果設(shè)為false,會(huì)使得某些操作(比如for...in循環(huán)、Object.keys())跳過(guò)該屬性。
  • configurableconfigurable是一個(gè)布爾值,表示可配置性,默認(rèn)為true。如果設(shè)為false,將阻止某些操作改寫屬性,比如無(wú)法刪除該屬性,也不得改變?cè)搶傩缘膶傩悦枋鰧?duì)象(value屬性除外)。也就是說(shuō),configurable屬性控制了屬性描述對(duì)象的可寫性。
  • getget是一個(gè)函數(shù),表示該屬性的取值函數(shù)(getter),默認(rèn)為undefined。
  • setset是一個(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

上面代碼中,toStringobj對(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可以寫成下面這樣。

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屬性不可寫。注意,這里的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ì)象,writableconfigurable、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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js實(shí)現(xiàn)拖動(dòng)模態(tài)框

    js實(shí)現(xiàn)拖動(dòng)模態(tài)框

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)拖動(dòng)模態(tài)框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • js canvas實(shí)現(xiàn)寫字動(dòng)畫效果

    js canvas實(shí)現(xiàn)寫字動(dòng)畫效果

    這篇文章主要為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)寫字動(dòng)畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • javascript 通用loading動(dòng)畫效果實(shí)例代碼

    javascript 通用loading動(dòng)畫效果實(shí)例代碼

    這篇文章主要介紹了javascript 通用loading動(dòng)畫效果實(shí)例代碼,有需要的朋友可以參考一下
    2014-01-01
  • JS FormData上傳文件的設(shè)置方法

    JS FormData上傳文件的設(shè)置方法

    使用FormData上傳文件時(shí),總是獲取不到req.file對(duì)象。發(fā)現(xiàn)是沒(méi)有配置對(duì)FormData導(dǎo)致的,怎么解決這個(gè)問(wèn)題呢?下面小編給大家?guī)?lái)了JS FormData上傳文件的設(shè)置方法,需要的朋友參考下吧
    2017-07-07
  • 對(duì)javascript繼承的理解

    對(duì)javascript繼承的理解

    昨天讀了關(guān)于javascript繼承的幾篇文章,對(duì)原型鏈、construct、this有了新的認(rèn)識(shí)
    2016-10-10
  • 小程序中英文混合排序問(wèn)題解決

    小程序中英文混合排序問(wèn)題解決

    這篇文章主要介紹了小程序中英文混合排序問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 微信小程序登錄按鈕遮罩浮層效果的實(shí)現(xiàn)方法

    微信小程序登錄按鈕遮罩浮層效果的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于微信小程序登錄按鈕遮罩浮層效果的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 前端JS面試中常見(jiàn)的算法問(wèn)題總結(jié)

    前端JS面試中常見(jiàn)的算法問(wèn)題總結(jié)

    雖然說(shuō)在前端很少有機(jī)會(huì)接觸到算法,大多都交互性的操作,然而從各大公司面試來(lái)看,算法依舊是考察的一方面。下面這篇文章就給大家總結(jié)了在前端JS面試中常見(jiàn)的算法問(wèn)題,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • 數(shù)據(jù)排序誰(shuí)最快(javascript中的Array.prototype.sort PK 快速排序)

    數(shù)據(jù)排序誰(shuí)最快(javascript中的Array.prototype.sort PK 快速排序)

    今天在51js論壇中看到一個(gè)網(wǎng)友發(fā)布了一個(gè)javasctipt實(shí)現(xiàn)的快速排序的算法,前些日子工作中也涉及到j(luò)avasctipt中數(shù)據(jù)排序的應(yīng)用,當(dāng)時(shí)為了提高排序速度,使用的也是快速排序的算法。
    2007-01-01
  • Bootstrap與KnockoutJs相結(jié)合實(shí)現(xiàn)分頁(yè)效果實(shí)例詳解

    Bootstrap與KnockoutJs相結(jié)合實(shí)現(xiàn)分頁(yè)效果實(shí)例詳解

    KnockoutJS是一個(gè)JavaScript實(shí)現(xiàn)的MVVM框架。接下來(lái)通過(guò)本文給大家介紹Bootstrap與KnockoutJs相結(jié)合實(shí)現(xiàn)分頁(yè)效果,對(duì)bootstrap knockoutjs相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05

最新評(píng)論

丰原市| 阳城县| 沈阳市| 甘南县| 襄垣县| 拉萨市| 黄冈市| 东安县| 醴陵市| 乳山市| 灵川县| 象山县| 宁国市| 白朗县| 星子县| 巴里| 开鲁县| 和田县| 孟津县| 开原市| 张家川| 柘荣县| 舒城县| 宁阳县| 郧西县| 鄱阳县| 甘孜| 新化县| 益阳市| 安仁县| 鹰潭市| 金秀| 新建县| 丹凤县| 铜梁县| 平陆县| 阿巴嘎旗| 武义县| 岑巩县| 始兴县| 凤山市|