1. ****Object: 多个属性的集合
数据属性: 保存一个数值的属性
四大特性:
1. value: 专门保存属性的值
2. writable: 控制属性是否可修改
3. enumerable: 控制一个属性能被for in遍历到
强调: 依然可用.访问
4. configurable: 控制2件事:
1. 能否修改属性的其他特性
2. 能否删除属性
何时使用: 只要希望保护属性时
如何访问:
1.获取:
Object.getOwnPropertyDescriptor(obj,"属性名");
用对象直接量添加的属性,四大特性默认都是true
2.修改或添加:
1.修改已有属性:
Object.defineProperty(obj,"属性名",{
特性名:特性值,
... ...
configurable:false //双保险,不可逆
})
2.添加新属性: 注意默认值: 都是false!
eg:
获取特性: */
var emp={id:1001,ename:"scott",salary:10000};
console.log(
Object.getOwnPropertyDescriptor(emp,"id")
);
//1. 设置id为只读
Object.defineProperty(emp,"id",{
writable:false,
configurable: false//双保险,不可逆!
});
emp.id=1234;
console.log(emp.id);
访问器属性: 专门保护私有数据属性的特殊属性
自己不保存数据,仅提供访问数据属性的方法
四大特性:
get:function(){return 数据属性的值}
set:function(value){
验证value;
数据属性=value;
}
enumerable:
configurable:
何时使用: 只要使用特定规则保护属性值,就只能用访问
器
属性。
如何定义
: 只能用Object.defineProperty
2步: 1. 定义一个实际存数据的属性或变量
2. 定义访问器属性,保护数据属性或变量
使用: 和普通数据属性完全一样,都用.访问。
只不过: 尝试读取值时,自动调get方法
尝试修改值时,自动调set方法
一般访问器属性都用在构造函数中
eg:
设置salary,不能被遍历到:
Object.defineProperty(emp,"salary",{
enumerable: false
})
for(var key in emp){//用for in遍历emp中每个属性
console.log(key+":"+emp[key]);//输出: 属性名:属性值
}
console.log(emp.salary);//正常输出
设置ename,属性不允许删除
Object.defineProperty(emp,"ename",{
configurable: false//不可逆!
})
delete emp.ename;//试图删除emp的ename
console.log(emp.ename);//输出emp的ename
eg:
一个屌丝试图将id改回可写!
Object.defineProperty(emp,"id",{
configurable: true//不可逆!
})
Object.defineProperty(emp,"id",{
writable:true
});
emp.id=1234;
console.log(emp.id);
eg:
添加新属性:为emp添加入职时间为当前时间*/
Object.defineProperty(emp,"hiredate",{
value:new Date(),
//writable:false,
enumerable:true
//configurable:false
});
console.log(
Object.getOwnPropertyDescriptor(emp,"hiredate")
);
//尝试篡改属性的特性,结果: 不可逆
Object.defineProperty(emp,"hiredate",{
writable:true,
configurable:true
});
//试图篡改属性值,结果: 只读
emp.hiredate=new Date("1990/12/12");
console.log(emp.hiredate);//没变