Object之defineProperty
對(duì)象是由多個(gè)名/值對(duì)組成的無序的集合。對(duì)象中每個(gè)屬性對(duì)應(yīng)任意類型的值。
定義對(duì)象可以使用構(gòu)造函數(shù)或字面量的形式:
?
除了以上添加屬性的方式,還可以使用Object.defineProperty定義新屬性或修改原有的屬性。
Object.defineProperty()
語法:
Object.defineProperty(obj, prop, descriptor)?
參數(shù)說明:
obj:必需。目標(biāo)對(duì)象?
prop:必需。需定義或修改的屬性的名字
descriptor:必需。目標(biāo)屬性所擁有的特性
返回值:
傳入函數(shù)的對(duì)象。即第一個(gè)參數(shù)obj
針對(duì)屬性,我們可以給這個(gè)屬性設(shè)置一些特性,比如是否只讀不可以寫;是否可以被for..in或Object.keys()遍歷。
給對(duì)象的屬性添加特性描述,目前提供兩種形式:數(shù)據(jù)描述和存取器描述。
?
數(shù)據(jù)描述
當(dāng)修改或定義對(duì)象的某個(gè)屬性的時(shí)候,給這個(gè)屬性添加一些特性:
var obj = {test:"hello" } //對(duì)象已有的屬性添加特性描述 Object.defineProperty(obj,"test",{configurable:true | false,enumerable:true | false,value:任意類型的值,writable:true | false }); //對(duì)象新添加的屬性的特性描述 Object.defineProperty(obj,"newKey",{configurable:true | false,enumerable:true | false,value:任意類型的值,writable:true | false });?
數(shù)據(jù)描述中的屬性都是可選的,來看一下設(shè)置每一個(gè)屬性的作用。
value
屬性對(duì)應(yīng)的值,可以使任意類型的值,默認(rèn)為undefined
var obj = {} //第一種情況:不設(shè)置value屬性 Object.defineProperty(obj,"newKey",{}); console.log( obj.newKey ); //undefined ------------------------------ //第二種情況:設(shè)置value屬性 Object.defineProperty(obj,"newKey",{value:"hello" }); console.log( obj.newKey ); //hello?
writable
屬性的值是否可以被重寫。設(shè)置為true可以被重寫;設(shè)置為false,不能被重寫。默認(rèn)為false。
var obj = {} //第一種情況:writable設(shè)置為false,不能重寫。 Object.defineProperty(obj,"newKey",{value:"hello",writable:false }); //更改newKey的值 obj.newKey = "change value"; console.log( obj.newKey ); //hello//第二種情況:writable設(shè)置為true,可以重寫 Object.defineProperty(obj,"newKey",{value:"hello",writable:true }); //更改newKey的值 obj.newKey = "change value"; console.log( obj.newKey ); //change value?
enumerable
此屬性是否可以被枚舉(使用for...in或Object.keys())。設(shè)置為true可以被枚舉;設(shè)置為false,不能被枚舉。默認(rèn)為false。
var obj = {} //第一種情況:enumerable設(shè)置為false,不能被枚舉。 Object.defineProperty(obj,"newKey",{value:"hello",writable:false,enumerable:false });//枚舉對(duì)象的屬性 for( var attr in obj ){console.log( attr ); } //第二種情況:enumerable設(shè)置為true,可以被枚舉。 Object.defineProperty(obj,"newKey",{value:"hello",writable:false,enumerable:true });//枚舉對(duì)象的屬性 for( var attr in obj ){console.log( attr ); //newKey }?
configurable
是否可以刪除目標(biāo)屬性或是否可以再次修改屬性的特性(writable, configurable, enumerable)。設(shè)置為true可以被刪除或可以重新設(shè)置特性;設(shè)置為false,不能被可以被刪除或不可以重新設(shè)置特性。默認(rèn)為false。
這個(gè)屬性起到兩個(gè)作用:
目標(biāo)屬性是否可以使用delete刪除
目標(biāo)屬性是否可以再次設(shè)置特性
?
除了可以給新定義的屬性設(shè)置特性,也可以給已有的屬性設(shè)置特性
//定義對(duì)象的時(shí)候添加的屬性,是可刪除、可重寫、可枚舉的。 var obj = {test:"hello" }//改寫值 obj.test = 'change value';console.log( obj.test ); //'change value' Object.defineProperty(obj,"test",{writable:false })//再次改寫值 obj.test = 'change value again';console.log( obj.test ); //依然是:'change value'?
提示:一旦使用Object.defineProperty給對(duì)象添加屬性,那么如果不設(shè)置屬性的特性,那么configurable、enumerable、writable這些值都為默認(rèn)的false
var obj = {}; //定義的新屬性后,這個(gè)屬性的特性中configurable,enumerable,writable都為默認(rèn)的值false //這就導(dǎo)致了neykey這個(gè)是不能重寫、不能枚舉、不能再次設(shè)置特性 // Object.defineProperty(obj,'newKey',{});//設(shè)置值 obj.newKey = 'hello'; console.log(obj.newKey); //undefined//枚舉 for( var attr in obj ){console.log(attr); }設(shè)置的特性總結(jié):
value: 設(shè)置屬性的值
writable: 值是否可以重寫。true | false
enumerable: 目標(biāo)屬性是否可以被枚舉。true | false
configurable: 目標(biāo)屬性是否可以被刪除或是否可以再次修改特性 true | false
?
?
存取器描述
當(dāng)使用存取器描述屬性的特性的時(shí)候,允許設(shè)置以下特性屬性:
var obj = {}; Object.defineProperty(obj,"newKey",{get:function (){} | undefined,set:function (value){} | undefinedconfigurable: true | falseenumerable: true | false });?
注意:當(dāng)使用了getter或setter方法,不允許使用writable和value這兩個(gè)屬性
getter/setter
當(dāng)設(shè)置或獲取對(duì)象的某個(gè)屬性的值的時(shí)候,可以提供getter/setter方法。
-
getter 是一種獲得屬性值的方法
-
setter是一種設(shè)置屬性值的方法。
在特性中使用get/set屬性來定義對(duì)應(yīng)的方法。
var obj = {}; var initValue = 'hello'; Object.defineProperty(obj,"newKey",{get:function (){//當(dāng)獲取值的時(shí)候觸發(fā)的函數(shù)return initValue; },set:function (value){//當(dāng)設(shè)置值的時(shí)候觸發(fā)的函數(shù),設(shè)置的新值通過參數(shù)value拿到initValue = value;} }); //獲取值 console.log( obj.newKey ); //hello//設(shè)置值 obj.newKey = 'change value';console.log( obj.newKey ); //change value?
注意:get或set不是必須成對(duì)出現(xiàn),任寫其一就可以。如果不設(shè)置方法,則get和set的默認(rèn)值為undefined
configurable和enumerable同上面的用法。
兼容性
在ie8下只能在DOM對(duì)象上使用,嘗試在原生的對(duì)象使用 Object.defineProperty()會(huì)報(bào)錯(cuò)。
轉(zhuǎn)載于:https://www.cnblogs.com/ksunone/p/9020682.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Object之defineProperty的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java String的intern
- 下一篇: python基础===将Flask用于实