摘要:也是一個隱藏函數,會在設置屬性值時調用當只對屬性定義而沒有定義時,此屬性進行復制操作時將被忽略,賦值會失敗但是不會報錯檢測屬性對象可以看作是屬性的集合,因此我們會經常檢測集合中成員的所屬關系,即判斷某個屬性是否存在于某個對象中。
對象屬性描述符
可寫(writable attribute),表明是否可以設置該屬性的值
可枚舉(enumerable attribute),表明是否可以通過for/in循環返回該值
可配置(configurable attribute),表明是否可以刪除或修改該屬性
在es5之前,通過代碼給對象創建的所有屬性都是可寫的、可枚舉的和可配置的。在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特性設置為false時,此屬性無法使用delete刪除,操作會默認失敗,因為此屬性是不可配置的,同時無法再修改configurable特性,會產生一個TypeError,即configurable修改成false是單向操作
enumerable此描述符控制的是屬性是否會出現在對象的屬性枚舉中,比如說for..in循環。如果把enumerable設置成false,這個屬性就不會出現在枚舉中,雖然可以正常訪問。
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循環遍歷時就無法獲取到a屬性,當你不希望某些特殊屬性出現在枚舉中,那就把它設置成enumerable:false
Getter和Setter在es5中可以使用getter和setter部分改寫默認操作,但是只能應用在當個屬性上,無法應用在整個對象上。getter是一個隱藏函數,會在獲取屬性值時調用。setter也是一個隱藏函數,會在設置屬性值時調用
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對象可以看作是屬性的集合,因此我們會經常檢測集合中成員的所屬關系,即判斷某個屬性是否存在于某個對象中。可以通過in運算符、hasOwnProperty()和propertyIsEnumerable()方法來檢測
in和hasOwnPropertyin運算符左側是屬性名,右側是對象,如果對象的自由屬性或繼承屬性中包含這個屬性則返回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"]
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88655.html
摘要:平時在復習基礎知識時,經常會遇到數據類型基礎數據類型內置對象包裝類型對象,檢測數據類型時,用到的值,感覺都差不多,但是又有差異。值與數據類型關系對比下圖,即可知值相較于基礎數據類型少多 平時在復習JS基礎知識時,經常會遇到JS數據類型、基礎數據類型、內置對象、包裝類型對象,檢測數據類型時,用到的typeof值,感覺都差不多,但是又有差異。今天特地整理下,方便理解。 JS數據類型 基礎數...
摘要:概述的解釋器優化器代碼可能在字節碼或者優化后的機器碼狀態下執行,而生成字節碼速度很快,而生成機器碼就要慢一些了。比如有一個函數,從獲取值引擎生成的字節碼結構是這樣的指令是獲取參數指向的對象,并存儲在,第二步則返回。 1 引言 本期精讀的文章是:JS 引擎基礎之 Shapes and Inline Caches 一起了解下 JS 引擎是如何運作的吧! JS 的運作機制可以分為 AST 分...
摘要:給普通的操作指定回調函數對象的最大優點,就是它把這一套回調函數接口,從操作擴展到了所有操作。方法用于指定對象狀態為已失敗時的回調函數。執行完畢執行成功執行失敗接收一個或多個對象作為參數,為其指定回調函數。 什么是deferred對象 開發網站的過程中,我們經常遇到某些耗時很長的javascript操作。其中,既有異步的操作(比如ajax讀取服務器數據),也有同步的操作(比如遍歷一個大型...
摘要:執行上下文作用域鏈和內部機制一執行上下文執行上下文是代碼的執行環境,它包括的值變量對象和函數。創建作用域鏈一旦可變對象創建完,引擎就開始初始化作用域鏈。 執行上下文、作用域鏈和JS內部機制(Execution context, Scope chain and JavaScript internals) 一、執行上下文 執行上下文(Execution context EC)是js代碼的執...
閱讀 2950·2021-11-23 09:51
閱讀 3776·2021-11-22 15:29
閱讀 3226·2021-10-08 10:05
閱讀 1552·2021-09-22 15:20
閱讀 952·2019-08-30 15:56
閱讀 1069·2019-08-30 15:54
閱讀 733·2019-08-26 11:54
閱讀 2636·2019-08-26 11:32