### Object.defineProperty()
https://segmentfault.com/a/1190000007434923
方法會直接在一個對象上定義一個新屬性,或者修改一個已經存在的屬性, 並返回這個對象。
語法
Object.defineProperty(obj,prop,descriptor)
#### 參數
obj
須要定義屬性的對象。
prop
需定義或修改的屬性的名字。
descriptor
將被定義或修改的屬性的描述符。
返回值
==返回傳入函數的對象,即第一個參數obj==segmentfault
```
value: 設置屬性的值
writable: 值是否能夠重寫。true | false
enumerable: 目標屬性是否能夠被枚舉。true | false
configurable: 目標屬性是否能夠被刪除或是否能夠再次修改特性 true | false
```函數
001 writable default : false
當writable 爲false 時 屬性值不容許被修改
```
01:
var obj={};
Object.defineProperty(obj,"a",
{
value:1
});
obj.a++;
console.dir(obj.a); // 1 測試
02:
var obj={};
Object.defineProperty(obj,"a",
{
value:"shangyy,
writable:true
});
obj.a="huyating";
console.dir(obj.a); //huyatingspa
```對象
002 enumerable 默認爲false 是否容許屬性被遍歷ip
```
01:
var obj={uname:"shangyy",age:18};
Object.defineProperty(obj,"a",
{
value:1,
writable:false,
enumerable:false
});
console.dir(Object.keys(obj)); // 0: "uname" 1: "age"get
var obj={uname:"shangyy",age:18};
Object.defineProperty(obj,"a",
{
value:1,
writable:false,
enumerable:false
});
console.dir(Object.keys(obj)); // 0: "uname" 1: "age" 2:"a"it
```io
003 configurable
是否能夠刪除目標屬性或是否能夠再次修改屬性的特性(writable, configurable, enumerable)。設置爲true能夠被刪除或能夠從新設置特性;設置爲false,不能被能夠被刪除或不能夠從新設置特性。默認爲false。console
這個屬性起到兩個做用:
目標屬性是否能夠使用delete刪除
目標屬性是否能夠再次設置特性
var obj = {}
#### 001 測試目標屬性是否能被刪除
```
//第一種狀況:configurable設置爲false,不能被刪除。
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:false,
enumerable:false,
configurable:false
});
//刪除屬性
delete obj.newKey;
console.log( obj.newKey ); //hello
//第二種狀況:configurable設置爲true,能夠被刪除。
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:false,
enumerable:false,
configurable:true
});
//刪除屬性
delete obj.newKey;
console.log( obj.newKey ); //undefined
```
002 測試是否能夠再次修改特性
```
//第一種狀況:configurable設置爲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 ); //報錯:Uncaught TypeError: Cannot redefine property: newKey
//第二種狀況:configurable設置爲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
```
#### ****getter或setter
==注意:當使用了getter或setter方法,不容許使用writable和value這兩個屬性==
注意:get或set不是必須成對出現,任寫其一就能夠。若是不設置方法,則get和set的默認值爲undefined
```
var obj = {};
var initValue = 'hello';
Object.defineProperty(obj,"newKey",{
get:function (){
//當獲取值的時候觸發的函數
return initValue;
},
set:function (value){
//當設置值的時候觸發的函數,設置的新值經過參數value拿到
initValue = value;
}
});
//獲取值
console.log( obj.newKey ); //hello
//設置值
obj.newKey = 'change value';
console.log( obj.newKey ); //change value```