摘要:對(duì)象是由多個(gè)名值對(duì)組成的無(wú)序的集合。對(duì)象中每個(gè)屬性對(duì)應(yīng)任意類(lèi)型的值。目標(biāo)屬性所擁有的特性返回值傳入函數(shù)的對(duì)象。給對(duì)象的屬性添加特性描述,目前提供兩種形式數(shù)據(jù)描述和存取器描述。兼容性在下只能在對(duì)象上使用,嘗試在原生的對(duì)象使用會(huì)報(bào)錯(cuò)。
對(duì)象是由多個(gè)名/值對(duì)組成的無(wú)序的集合。對(duì)象中每個(gè)屬性對(duì)應(yīng)任意類(lèi)型的值。
定義對(duì)象可以使用構(gòu)造函數(shù)或字面量的形式:
var obj = new Object; //obj = {} obj.name = "張三"; //添加描述 obj.say = function(){}; //添加行為
除了以上添加屬性的方式,還可以使用Object.defineProperty定義新屬性或修改原有的屬性。
Object.defineProperty()語(yǔ)法:
Object.defineProperty(obj, prop, descriptor)
參數(shù)說(shuō)明:
obj:必需。目標(biāo)對(duì)象
prop:必需。需定義或修改的屬性的名字
descriptor:必需。目標(biāo)屬性所擁有的特性
返回值:
傳入函數(shù)的對(duì)象。即第一個(gè)參數(shù)obj
針對(duì)屬性,我們可以給這個(gè)屬性設(shè)置一些特性,比如是否只讀不可以寫(xiě);是否可以被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:任意類(lèi)型的值, writable:true | false }); //對(duì)象新添加的屬性的特性描述 Object.defineProperty(obj,"newKey",{ configurable:true | false, enumerable:true | false, value:任意類(lèi)型的值, writable:true | false });
數(shù)據(jù)描述中的屬性都是可選的,來(lái)看一下設(shè)置每一個(gè)屬性的作用。
value屬性對(duì)應(yīng)的值,可以使任意類(lèi)型的值,默認(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 ); //hellowritable
屬性的值是否可以被重寫(xiě)。設(shè)置為true可以被重寫(xiě);設(shè)置為false,不能被重寫(xiě)。默認(rèn)為false。
var obj = {} //第一種情況:writable設(shè)置為false,不能重寫(xiě)。 Object.defineProperty(obj,"newKey",{ value:"hello", writable:false }); //更改newKey的值 obj.newKey = "change value"; console.log( obj.newKey ); //hello //第二種情況:writable設(shè)置為true,可以重寫(xiě) Object.defineProperty(obj,"newKey",{ value:"hello", writable:true }); //更改newKey的值 obj.newKey = "change value"; console.log( obj.newKey ); //change valueenumerable
此屬性是否可以被枚舉(使用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è)置特性
//-----------------測(cè)試目標(biāo)屬性是否能被刪除------------------------ var obj = {} //第一種情況:configurable設(shè)置為false,不能被刪除。 Object.defineProperty(obj,"newKey",{ value:"hello", writable:false, enumerable:false, configurable:false }); //刪除屬性 delete obj.newKey; console.log( obj.newKey ); //hello //第二種情況:configurable設(shè)置為true,可以被刪除。 Object.defineProperty(obj,"newKey",{ value:"hello", writable:false, enumerable:false, configurable:true }); //刪除屬性 delete obj.newKey; console.log( obj.newKey ); //undefined //-----------------測(cè)試是否可以再次修改特性------------------------ var obj = {} //第一種情況:configurable設(shè)置為false,不能再次修改特性。 Object.defineProperty(obj,"newKey",{ value:"hello", writable:false, enumerable:false, configurable:false }); //重新修改特性 Object.defineProperty(obj,"newKey",{ value:"hello", writable:true, enumerable:true, configurable:true }); console.log( obj.newKey ); //報(bào)錯(cuò):Uncaught TypeError: Cannot redefine property: newKey //第二種情況:configurable設(shè)置為true,可以再次修改特性。 Object.defineProperty(obj,"newKey",{ value:"hello", writable:false, enumerable:false, configurable:true }); //重新修改特性 Object.defineProperty(obj,"newKey",{ value:"hello", writable:true, enumerable:true, configurable:true }); console.log( obj.newKey ); //hello
除了可以給新定義的屬性設(shè)置特性,也可以給已有的屬性設(shè)置特性
//定義對(duì)象的時(shí)候添加的屬性,是可刪除、可重寫(xiě)、可枚舉的。 var obj = { test:"hello" } //改寫(xiě)值 obj.test = "change value"; console.log( obj.test ); //"change value" Object.defineProperty(obj,"test",{ writable:false }) //再次改寫(xiě)值 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è)是不能重寫(xiě)、不能枚舉、不能再次設(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: 值是否可以重寫(xiě)。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){} | undefined configurable: true | false enumerable: true | false });
注意:當(dāng)使用了getter或setter方法,不允許使用writable和value這兩個(gè)屬性
getter/setter當(dāng)設(shè)置或獲取對(duì)象的某個(gè)屬性的值的時(shí)候,可以提供getter/setter方法。
getter 是一種獲得屬性值的方法
setter是一種設(shè)置屬性值的方法。
在特性中使用get/set屬性來(lái)定義對(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è)置的新值通過(guò)參數(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),任寫(xiě)其一就可以。如果不設(shè)置方法,則get和set的默認(rèn)值為undefined
configurable和enumerable同上面的用法。
兼容性在ie8下只能在DOM對(duì)象上使用,嘗試在原生的對(duì)象使用 Object.defineProperty()會(huì)報(bào)錯(cuò)。
如果對(duì)你有幫助,請(qǐng)關(guān)注【前端技能解鎖】:
參考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80821.html
摘要:是通過(guò)它實(shí)現(xiàn)雙向綁定的。。而且也被草案發(fā)起人撤回了。。傳入?yún)?shù)第一個(gè)參數(shù)目標(biāo)對(duì)象第二個(gè)參數(shù)需要定義的屬性或方法的名字。第三個(gè)參數(shù)目標(biāo)屬性所擁有的特性。打印沒(méi)有錯(cuò)誤拋出在嚴(yán)格模式下會(huì)拋出,即使之前已經(jīng)有相同的值打印,賦值不起作用。 這個(gè)方法了不起啊。。vue.js是通過(guò)它實(shí)現(xiàn)雙向綁定的。。而且Object.observe也被草案發(fā)起人撤回了。。所以defineProperty更有必要了解...
摘要:數(shù)據(jù)描述符是一個(gè)具有值的屬性,該值可能是可寫(xiě)的,也可能不是可寫(xiě)的。描述符必須是這兩種形式之一不能同時(shí)是兩者。注意點(diǎn)運(yùn)算符和為對(duì)象的屬性賦值時(shí),數(shù)據(jù)描述符中的屬性默認(rèn)值是不同的,如下例所示。 一、概念語(yǔ)法 Object.defineProperty(obj,prop,descriptor) 參數(shù): 1.obj:要在其上定義屬性的對(duì)象 2.key:要定義或者修改的屬性 3.descript...
摘要:返回值被傳遞給函數(shù)的對(duì)象。描述該方法允許精確添加或修改對(duì)象的屬性。描述符必須是兩種形式之一不能同時(shí)是兩者。可以是任何有效的值數(shù)值,對(duì)象,函數(shù)等。該方法返回值被用作屬性值。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性。 Object.defineProperties() Object.defineProperty() 方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性...
摘要:前言是新增的一個(gè),其作用是給對(duì)象的屬性增加更多的控制。使用方法提供了一種直接的方式來(lái)定義對(duì)象屬性或者修改已有對(duì)象屬性。數(shù)據(jù)描述符是一個(gè)擁有可寫(xiě)或不可寫(xiě)值的屬性。存取描述符是由一對(duì)函數(shù)功能來(lái)描述的屬性。這也是實(shí)現(xiàn)雙向數(shù)據(jù)綁定的關(guān)鍵。 前言 Object.defineProperty是ES5新增的一個(gè)API,其作用是給對(duì)象的屬性增加更多的控制。在我們?nèi)粘5腸oding中,這個(gè)API用到的地...
摘要:理解的函數(shù)在進(jìn)入今天的內(nèi)容之前我們可以先考慮這么一個(gè)場(chǎng)景在你的項(xiàng)目中你有這么一個(gè)對(duì)象如下所示我們的要求就是你要給添加一個(gè)屬性當(dāng)?shù)幕蛘甙l(fā)生變化的時(shí)候也要隨之變化而且當(dāng)我們?cè)O(shè)置了的值的時(shí)候那么相應(yīng)的它的和也隨之發(fā)生變化那么我們應(yīng)該怎么做呢如果你 理解JavaScript的Object.defineProperty()函數(shù) 在進(jìn)入今天的內(nèi)容之前,我們可以先考慮這么一個(gè)場(chǎng)景,在你的項(xiàng)目中你有這...
閱讀 5739·2021-11-24 10:25
閱讀 2689·2021-11-16 11:44
閱讀 3843·2021-10-11 11:09
閱讀 3172·2021-09-02 15:41
閱讀 3256·2019-08-30 14:14
閱讀 2271·2019-08-29 14:10
閱讀 2345·2019-08-29 11:03
閱讀 1125·2019-08-26 13:47