1–对象属性的定义 Object.defineProperty
1–简单的
obj.a=3;
obj["b"]=5;
2–属性描述对象 Object.defineProperty
var obj = {};
Object.defineProperty(obj, "a", {
configurable: false,// 是否可删除属性并且是否可以重定义该属性的属性描述对象,默认值是false
enumerable: false,// 是否可以遍历,是否可枚举(该对象在使用for in遍历时,不可枚举属性是不能被遍历,也不能被Object.assign()复制)
writable: false,// 是否可写,是否能够修改值
value: 10,// 是值,还可以是function方法
});
当定义set和get时,不能定义value和writable属性
get必须有返回,set必须有参数
var obj = {_b:1};
Object.defineProperty(obj, "b", {
configurable: false,
enumerable: false,
// get和set不能够和writable和value同时定义
get: function () {
return this._b;
},
set: function (value) {
this._b=value;
}
})
2----对象属性的获取
for in可以遍历所有的可枚举属性
浅紫色是不可枚举属性
1----将可枚举属性设置为不可枚举属性
普通的遍历对象获取属性,会遍历所有的可枚举属性
//普通的遍历对象获取属性,会遍历所有的可枚举属性
var obj={
a:1,
b:2,
abc:function(){
console.log("abc")
}
}
for(var prop in obj){
console.log(prop);//a b abc
}
当不需要遍历abc时,把abc设置为不可枚举属性
var obj={
a:1,
b:2
}
------设置abc属性为不可枚举属性
Object.defineProperty(obj,"abc",{//设置abc属性为不可枚举属性
configurable:false,
enumerable:false,
writable:false,
value:function(){
console.log("abc")
}
});
console.log(obj);//{a:1,b:2,abc:function()}
obj.abc();//'abc'
for(var prop in obj){
console.log(prop);// a b abc不会被遍历
}
----object assign只能复制对象的可枚举属性
var obj1=Object.assign({},obj);
console.log(obj1)//复制的obj1也没有abc属性
2----将不可枚举修改为可枚举属性
需要先重定义将configurable设置为true,然后设置enumerable设置为true
var obj={
a:1,
b:2
}
Object.defineProperty(obj,"abc",{
configurable:true,//---------------
enumerable:false,
writable:false,
value:function(){
console.log("abc")
}
});
Object.defineProperty(obj,"abc",{
enumerable:true//-----------
});
for(var prop in obj){
console.log(prop);
}
原型链属性是不可以被修改的,也不能被删除,不会报错
var obj={
a:1,
b:2
}
Object.defineProperty(obj,"__proto__",{
enumerable:true,
})
delete obj.__proto__;
console.log(obj);//还是原来的
configurable设置为false的时候,该对象属性是不能被删除的,也不会报错
//configurable是false,不能删除
delete obj.abc;
当设置writable为false,configurable:true 不能被修改,能被删除
Object.defineProperty(obj,"c",{
configurable:true,
enumerable:true,
writable:false,
value:10
});
delete obj.c;
obj.c=20;
console.log(obj); //{c:10}
既不能修改又不能删除
Object.defineProperty(obj,"c",{
enumerable:true,
value:100
});
console.log(obj);
3-----定义多个属性 Object.defineProperties
Object.defineProperties(obj,{
"c":{
// 描述对象
value:function(){
}
},
d:{
// 描述对象
value:10,
writable:true
},
e:{
value:20,
writable:true,
configurable:true
},
f:{
value:30,
enumerable:true
}
});
console.log(obj);
4------获取所有属性名称
获取obj的所有属性,包括不可枚举属性,不包括__proto__,把所有的属性名放在一个数组中返回
var arr=Object.getOwnPropertyNames(obj);
console.log(arr);
5-----获取该属性的描述对象
// 获取某个属性的描述对象
var desc=Object.getOwnPropertyDescriptor(obj,"f");
console.log(desc); //{configurable:false,enumerable:true,writable:false,value:30,}