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