摘要:也是一個(gè)隱藏函數(shù),會(huì)在設(shè)置屬性值時(shí)調(diào)用當(dāng)只對(duì)屬性定義而沒(méi)有定義時(shí),此屬性進(jìn)行復(fù)制操作時(shí)將被忽略,賦值會(huì)失敗但是不會(huì)報(bào)錯(cuò)檢測(cè)屬性對(duì)象可以看作是屬性的集合,因此我們會(huì)經(jīng)常檢測(cè)集合中成員的所屬關(guān)系,即判斷某個(gè)屬性是否存在于某個(gè)對(duì)象中。
對(duì)象屬性描述符
可寫(xiě)(writable attribute),表明是否可以設(shè)置該屬性的值
可枚舉(enumerable attribute),表明是否可以通過(guò)for/in循環(huán)返回該值
可配置(configurable attribute),表明是否可以刪除或修改該屬性
在es5之前,通過(guò)代碼給對(duì)象創(chuàng)建的所有屬性都是可寫(xiě)的、可枚舉的和可配置的。在es5中則可以對(duì)這些特性加以配置
示例代碼:
var one = {} Object.defineProperty(one, "a", { value : 1, writable : false, configurable: true, enumerable: true }) one.a = 2; console.log(one.a) //1
如示例,當(dāng)將對(duì)象的屬性的writable特性定義為false時(shí),對(duì)屬性值的修改就會(huì)靜默失敗
configurable只要屬性是可配置的,就可以使用defineProperty()方法來(lái)修改屬性:
var one = {} Object.defineProperty(one, "a", { value : 1, writable : true, configurable: false, enumerable: true }) console.log(one.a) //1 one.a = 2; console.log(one.a) //2 delete one.a console.log(one.a) //2 Object.defineProperty(one, "a", { value: 3, writable: true, configurable: true, enumerable: true }) //TypeError
當(dāng)屬性的configurable特性設(shè)置為false時(shí),此屬性無(wú)法使用delete刪除,操作會(huì)默認(rèn)失敗,因?yàn)榇藢傩允遣豢膳渲玫模瑫r(shí)無(wú)法再修改configurable特性,會(huì)產(chǎn)生一個(gè)TypeError,即configurable修改成false是單向操作
enumerable此描述符控制的是屬性是否會(huì)出現(xiàn)在對(duì)象的屬性枚舉中,比如說(shuō)for..in循環(huán)。如果把enumerable設(shè)置成false,這個(gè)屬性就不會(huì)出現(xiàn)在枚舉中,雖然可以正常訪問(wèn)。
var one = {b:2} Object.defineProperty(one, "a", { value : 1, writable : true, configurable: true, enumerable: false }) for (var key in one) { console.log(key + "---" + one[key]) //b---2 }
如上例所示,one對(duì)象定義了一個(gè)不可枚舉的屬性a,那么在for..in循環(huán)遍歷時(shí)就無(wú)法獲取到a屬性,當(dāng)你不希望某些特殊屬性出現(xiàn)在枚舉中,那就把它設(shè)置成enumerable:false
Getter和Setter在es5中可以使用getter和setter部分改寫(xiě)默認(rèn)操作,但是只能應(yīng)用在當(dāng)個(gè)屬性上,無(wú)法應(yīng)用在整個(gè)對(duì)象上。getter是一個(gè)隱藏函數(shù),會(huì)在獲取屬性值時(shí)調(diào)用。setter也是一個(gè)隱藏函數(shù),會(huì)在設(shè)置屬性值時(shí)調(diào)用
var one = { get a() { return this._a_; }, set a(val) { this._a_ = val * 2 } } one.a = 2 console.log(one.a) //4
Tips:當(dāng)只對(duì)屬性定義getter而沒(méi)有定義setter時(shí),此屬性進(jìn)行復(fù)制操作時(shí)將被忽略,賦值會(huì)失敗但是不會(huì)報(bào)錯(cuò)
檢測(cè)屬性js對(duì)象可以看作是屬性的集合,因此我們會(huì)經(jīng)常檢測(cè)集合中成員的所屬關(guān)系,即判斷某個(gè)屬性是否存在于某個(gè)對(duì)象中。可以通過(guò)in運(yùn)算符、hasOwnProperty()和propertyIsEnumerable()方法來(lái)檢測(cè)
in和hasOwnPropertyin運(yùn)算符左側(cè)是屬性名,右側(cè)是對(duì)象,如果對(duì)象的自由屬性或繼承屬性中包含這個(gè)屬性則返回true,對(duì)象的hasOwnProperty()方法用來(lái)檢測(cè)給定的名字是否是對(duì)象的自有屬性。對(duì)于繼承屬性將返回false:
var one = { a:1 } console.log("a" in one) //true console.log("b" in one) //false console.log("toString" in one) //true console.log(one.hasOwnProperty("a")) //true console.log(one.hasOwnProperty("b")) //false console.log(one.hasOwnProperty("toString")) //falsepropertyIsEnumerable
propertyIsEnumerable()會(huì)檢查給定的屬性是否直接存在于對(duì)象中并且滿(mǎn)足enumerable:true:
var one = {} Object.defineProperty(one, "a", { value : 1, enumerable: true }) Object.defineProperty(one, "b", { value : 2, enumerable: false }) console.log(one.propertyIsEnumerable("a")) //true console.log(one.propertyIsEnumerable("b")) //false console.log(Object.keys(one)) //["a"] console.log(Object.getOwnPropertyNames(one)) //["a","b"]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/88655.html
摘要:平時(shí)在復(fù)習(xí)基礎(chǔ)知識(shí)時(shí),經(jīng)常會(huì)遇到數(shù)據(jù)類(lèi)型基礎(chǔ)數(shù)據(jù)類(lèi)型內(nèi)置對(duì)象包裝類(lèi)型對(duì)象,檢測(cè)數(shù)據(jù)類(lèi)型時(shí),用到的值,感覺(jué)都差不多,但是又有差異。值與數(shù)據(jù)類(lèi)型關(guān)系對(duì)比下圖,即可知值相較于基礎(chǔ)數(shù)據(jù)類(lèi)型少多 平時(shí)在復(fù)習(xí)JS基礎(chǔ)知識(shí)時(shí),經(jīng)常會(huì)遇到JS數(shù)據(jù)類(lèi)型、基礎(chǔ)數(shù)據(jù)類(lèi)型、內(nèi)置對(duì)象、包裝類(lèi)型對(duì)象,檢測(cè)數(shù)據(jù)類(lèi)型時(shí),用到的typeof值,感覺(jué)都差不多,但是又有差異。今天特地整理下,方便理解。 JS數(shù)據(jù)類(lèi)型 基礎(chǔ)數(shù)...
摘要:概述的解釋器優(yōu)化器代碼可能在字節(jié)碼或者優(yōu)化后的機(jī)器碼狀態(tài)下執(zhí)行,而生成字節(jié)碼速度很快,而生成機(jī)器碼就要慢一些了。比如有一個(gè)函數(shù),從獲取值引擎生成的字節(jié)碼結(jié)構(gòu)是這樣的指令是獲取參數(shù)指向的對(duì)象,并存儲(chǔ)在,第二步則返回。 1 引言 本期精讀的文章是:JS 引擎基礎(chǔ)之 Shapes and Inline Caches 一起了解下 JS 引擎是如何運(yùn)作的吧! JS 的運(yùn)作機(jī)制可以分為 AST 分...
摘要:給普通的操作指定回調(diào)函數(shù)對(duì)象的最大優(yōu)點(diǎn),就是它把這一套回調(diào)函數(shù)接口,從操作擴(kuò)展到了所有操作。方法用于指定對(duì)象狀態(tài)為已失敗時(shí)的回調(diào)函數(shù)。執(zhí)行完畢執(zhí)行成功執(zhí)行失敗接收一個(gè)或多個(gè)對(duì)象作為參數(shù),為其指定回調(diào)函數(shù)。 什么是deferred對(duì)象 開(kāi)發(fā)網(wǎng)站的過(guò)程中,我們經(jīng)常遇到某些耗時(shí)很長(zhǎng)的javascript操作。其中,既有異步的操作(比如ajax讀取服務(wù)器數(shù)據(jù)),也有同步的操作(比如遍歷一個(gè)大型...
摘要:執(zhí)行上下文作用域鏈和內(nèi)部機(jī)制一執(zhí)行上下文執(zhí)行上下文是代碼的執(zhí)行環(huán)境,它包括的值變量對(duì)象和函數(shù)。創(chuàng)建作用域鏈一旦可變對(duì)象創(chuàng)建完,引擎就開(kāi)始初始化作用域鏈。 執(zhí)行上下文、作用域鏈和JS內(nèi)部機(jī)制(Execution context, Scope chain and JavaScript internals) 一、執(zhí)行上下文 執(zhí)行上下文(Execution context EC)是js代碼的執(zhí)...
閱讀 2959·2021-11-23 09:51
閱讀 3783·2021-11-22 15:29
閱讀 3241·2021-10-08 10:05
閱讀 1562·2021-09-22 15:20
閱讀 978·2019-08-30 15:56
閱讀 1077·2019-08-30 15:54
閱讀 739·2019-08-26 11:54
閱讀 2641·2019-08-26 11:32