国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

理解Object.defineProperty的作用

yexiaobai / 3455人閱讀

摘要:對(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..inObject.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 );  //hello
writable

屬性的值是否可以被重寫(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 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è)置特性

//-----------------測(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ān)文章

  • 解析神奇 Object.defineProperty

    摘要:是通過(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更有必要了解...

    pinecone 評(píng)論0 收藏0
  • 個(gè)人理解Object.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...

    lieeps 評(píng)論0 收藏0
  • JavaScript深入理解對(duì)象方法——Object.defineProperty()

    摘要:返回值被傳遞給函數(shù)的對(duì)象。描述該方法允許精確添加或修改對(duì)象的屬性。描述符必須是兩種形式之一不能同時(shí)是兩者。可以是任何有效的值數(shù)值,對(duì)象,函數(shù)等。該方法返回值被用作屬性值。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性。 Object.defineProperties() Object.defineProperty() 方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性...

    woshicixide 評(píng)論0 收藏0
  • 詳解Object.defineProperty()

    摘要:前言是新增的一個(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用到的地...

    HtmlCssJs 評(píng)論0 收藏0
  • 理解JavaScriptObject.defineProperty()函數(shù)

    摘要:理解的函數(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)目中你有這...

    ninefive 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<