一、ES5给Object扩展了一些静态方法, 常用的2个:
1. Object.create(prototype, [descriptors])
作用: 以指定对象为原型创建新的对象,为新的对象指定新的属性, 并对属性进行描述。
- value : 指定值
- writable : 标识当前属性值是否是可修改的,默认为false。
- configurable: 标识当前属性是否可以被删除,默认为false。
- enumerable: 标识当前属性是否能用for in 枚举,默认为false。
<script type="text/javascript">
var obj = {name : 'curry', age : 29}
var obj1 = {};
obj1 = Object.create(obj, {
sex : {
value : '男',
writable : true,
configurable:true,
enumerable:true
}
});
console.log(obj1.sex);
obj1.sex = '女';
console.log(obj1.sex);
delete obj1.sex;
console.log(obj1);
</script>
打印结果:
可见,修改和成功都 OK 。
现在我们来看看 for in 枚举,我们先把 delete 注释掉。
<script type="text/javascript">
var obj = {name : 'curry', age : 29}
var obj1 = {};
obj1 = Object.create(obj, {
sex : {
value : '男',
writable : true,
configurable:true,
enumerable:true
}
});
console.log(obj1);
console.log(obj1.sex);
obj1.sex = '女';
console.log(obj1.sex);
// delete obj1.sex;
// console.log(obj1);
for(var i in obj1){
console.log(i);
}
</script>
打印结果:
2. Object.defineProperties(object, descriptors)
作用: 为指定对象定义扩展多个属性。
- get :用来获取当前属性值得回调函数。
- set :修改当前属性值得触发的回调函数,并且实参即为修改后的值。
- 存取器属性:setter,getter一个用来存值,一个用来取值。
var obj2 = {
firstName : 'curry',
lastName : 'stephen'
};
Object.defineProperties(obj2, {
fullName : {
get : function () { //获取扩展属性的值,获取扩展属性值时,get方法自动调用
console.log("get()");
return this.firstName + '-' + this.lastName
},
set : function (data) {
//监听扩展属性,当扩展属性发生变化时会自动回调,自动回调后会将变化的值作为实参注入到set函数
console.log("set()");
var names = data.split('-');
this.firstName = names[0];
this.lastName = names[1];
}
}
});
console.log(obj2);
console.log(obj2.fullName);
obj2.firstName = 'tim';
obj2.lastName = 'duncan';
console.log(obj2.fullName);
obj2.fullName = 'kobe-bryant';
console.log(obj2.fullName);
打印结果:
二、对象本身的两个方法
- get propertyName(){} 用来得到当前属性值的回调函数。
- set propertyName(){} 用来监视当前属性值变化的回调函数。
<script type='text/javascript'>
var obj = {
firstName : 'kobe',
lastName : 'bryant',
get fullName(){
return this.firstName + ' ' + this.lastName
},
set fullName(data){
var names = data.split(' ');
this.firstName = names[0];
this.lastName = names[1];
}
};
console.log(obj);
console.log(obj.fullName);
obj.fullName = 'curry stephen';
console.log(obj.fullName);
</script>