1、Object.defineProperty:給一個對象定義一個新的屬性或修改一個對象現有的屬性,而且返回這個對象數組
1.語法:Object.defineProperty(參數1,參數2,參數3)this
參數1:目標對象spa
參數2:須要修改或者添加的屬性名prototype
參數3:目標對象屬性的一些特徵(是一個對象)code
其中參數3中也有一些參數:對象
參數1:value:屬性值blog
參數2:writable:對象屬性值是否可被修改,true表示容許,false表示不容許繼承
參數3:configurable:對象屬性是否可被刪除,true爲容許,false爲不容許get
參數4:enumerable:對象屬性是否可被枚舉(即遍歷)原型
參數5:get():給一個屬性提供getter方法,當訪問這個對象的屬性值時觸發該方法
參數6:set():給一個屬性提供setter方法,當設置這個對象的屬性值時觸發該方法
2、參數示例
一、value
var obj = {};
Object.defineProperty(obj,"name",{value:"Leslie Cheung"});
Object.defineProperty(obj,"age",{value:22});
console.log(obj);//Object(是一個Object對象)
二、writable
var obj = {};
Object.defineProperty(obj,"name",{
value:"Leslie Cheung",
writable:false//爲false時不容許修改
})
obj.name = "leslie-cheung";
console.log(obj.name);//Leslie Cheung
var obj = {};
Object.defineProperty(obj,"name",{
value:"Leslie Cheung",
writable:true//爲true時容許修改
})
obj.name = "leslie-cheung";
console.log(obj.name);//leslie-cheung
三、configurable
var obj = {};
Object.defineProperty(obj,"name",{
value:"Leslie Cheung",
configurable:false//爲false時不容許被刪除
})
delete obj.name;
console.log(obj.name);//Leslie Cheung
var obj = {};
Object.defineProperty(obj,"name",{
value:"Leslie Cheung",
configurable:true//爲true時容許被刪除
})
delete obj.name;
console.log(obj.name);//undefined
四、enumerable
var obj = {name:"Leslie Cheung",age:"20"};
Object.defineProperty(obj,"name",{
enumerable:false//爲false時不可被遍歷
});
Object.defineProperty(obj,"age",{
enumerable:false//爲false時不可被遍歷
});
console.log(Object.keys(obj));//[]
var obj = {name:"Leslie Cheung",age:"20"};
Object.defineProperty(obj,"name",{
enumerable:true//爲true時可被遍歷
});
Object.defineProperty(obj,"age",{
enumerable:true//爲true時可被遍歷
});
console.log(Object.keys(obj));//["name", "age"]
五、get()和set()
var obj = {name:"Leslie Cheung"};
Object.defineProperty(obj,"name",{
get(){
console.log("被訪問,觸發get()方法");//被訪問時觸發get()方法
},
set(val){
console.log("被設置了" + val + ",觸發set()方法");//被設置時觸發set()方法
}
});
obj.name;//輸出結果:被訪問,觸發get()方法
obj.name = "leslie-cheung";//輸出結果:被設置了leslie-cheung,觸發set()方法
注意:當使用了get()方法或者set()方法的時候就不能使用value和writable中的任何一個屬性不然會報錯
六、for in和Object.keys()的區別
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype = {
sex:"男"
}
var man = new Person("Leslie Cheung",20);
console.log(Object.keys(man));//["name", "age"],返回一個數組,數組值爲對象自身的屬性,不包括繼承原型的屬性
for(var key in man){
console.log(key);//name age sex,遍歷對象可枚舉的屬性,包括自身的屬性,以及繼承原型的屬性
}