<script type="text/javascript">
/*
Object.create(prototype[,descriptors])
创建一个对象,并把其prototype属性赋值为第一个参数,同时可以设置多个descriptors。
*/
var Cat = Object.create({
"name": 'miaomiao',
'food': function() {
alert('I love fish');
}
});
console.log('猫实例', Cat);
console.log('================================================================');
/*
Object.defineProperty(obj, prop, descriptor)
1. value: 任何值,默认是undefined
2. writable: 是否可以被重写,默认是false
3. enumerable: 是否可以被循环(使用for...in或Object.keys()), 默认是false
4. configurable: 是否可被删除,是否可以再次设置特性
5. get: 返回property的值的方法,默认是undefined
6. set: 为property设置值的方法,默认是undefined
*/
var person = Object.create({})
Object.defineProperty(person ,'age', {
value: '24',
writable: true, //只读
enumerable: true, //可被循环
configurable: true //可被删除
});
Object.defineProperty(person, 'name', {
value: 'datura_lj',
writable: false, //可修改
enumerable: false, //不可被循环
configurable: false //不可被删除
});
console.log('person', person);
person.age = 17;
person.name = 'shuaishuai';
console.log(person);
for (var key in person) {
console.log(key + ':' + person[key]);
}
delete person.age;
delete person.name;
console.log(person);
/*
Object.defineProperties(); 批量设置
*/
Object.defineProperties(person, {
'job': {
value: '搬砖的',
writable: true,
enumerable: true,
configurable: true
},
'sex': {
value: 'man',
writable: false,
enumerable: false,
configurable: false
}
});
console.log(person);
/*
Object.getOwnPropertyDescriptor(obj, property)
获取defineProperty方法设置的property 特性(只读,删除等)
*/
console.log(Object.getOwnPropertyDescriptor(person, 'job'));
/*
Object.getOwnPropertyNames(obj)
//获取所有的属性名,不包括prototy中的属性,返回一个数组
*/
console.log(Object.getOwnPropertyNames(person));
/*
Object.keys(obj)
和getOwnPropertyNames方法类似,但是获取所有的可以循环的属性,返回一个数组
*/
console.log(Object.keys(person));
console.log('================================================================');
/*
Object.preventExtensions(obj) 锁住对象属性,使其不能够拓展,也就是不能增加新的属性,但是属性的值仍然可以更改,也可以把属性删除
Object.isExtensible(obj) 用于判断对象是否可以被拓展,返回值为true/false
*/
console.log(Object.isExtensible(person)); //true 判断对象是否可以被拓展
person.hobby = 'money';
console.log(person.hobby); //money ,此时对象可以拓展
Object.preventExtensions(person);
console.log(Object.isExtensible(person)); //false 判断对象是否可以被拓展
person.hobby = "code";
console.log(person.hobby); //code,属性值仍然可以修改
console.log(person.hobby); //undefined仍可删除属性
delete person.hobby;
console.log(person.hobby); //undefined仍可删除属性
person.like = 'woman'; //Can't add property firstname, object is not extensible 不能够添加属性
console.log(person.like);
console.log('================================================================');
/*
Object.seal(obj) 让对象既不可以拓展也不可以删除属性(把每个属性的configurable设为false),单数属性值仍然可以修改;
Object.isSealed由于判断对象是否被密封
*/
Object.seal(person);
person.name = '007'; //仍然可以修改
console.log(person.name)
delete person.name; //Cannot delete property 'age' of #<Object>
console.log(person.name)
console.log('================================================================');
/*
Object.freeze(obj) 完全冻结对象,在seal的基础上,属性值也不可以修改(每个属性的wirtable也被设为false)
*/
Object.freeze(person);
person.aaa = 25; //Cannot assign to read only property 'age' of #<Object>
console.log(person.aaa)
</script>