一、对象的可扩展性
1.所有内置对象和自定义对象都是显示可扩展的,宿主对象的可扩展性由JavaScript引擎定义的
2.可以通过Object.preventExtensions()将对象设置为不可扩展的,而且不能再转换为可扩展的了。
Object.isExtensibke()检测对象是否是可扩展的
3.preventExtensions()只影响到对象本身的可扩展性,如果给一个不可扩展的对象的原型添加属性,不可扩展的对象同样会继承这些新属性。
4.Object.seal()和Object.preventExtensions()类似,除了能够将对象设置为不可扩展的,还可以将竖向都设置为不可配置的,也就是说不能给这个对象添加新属性,而且它已有的属性也不可删除,已有的可写属性依然可以设置,可以通过Object.isSealed()检测对象是否封闭
5.Object.freeze()将要严格地锁定对象——冻结。除了对象设置为不可扩展的,还可以将它自身的所有数据属性设置为只读(如果对象的存储器属性具有setter方法,存储器仍可以通过给属性赋值调用他们)。可以使用)Object.isFroze()来检测对象是否冻结。
// 检测对象是否可扩展
// var obj={};
// console.log(Object.isExtensible(obj));
// var d=new Date();
// console.log(Object.isExtensible(d));
// obj.x=1;
// console.log(obj.x);
// 通过preventExtensions()将对象变为不可扩展的
// obj1=Object.preventExtensions(obj);
// console.log(obj==obj1);
// console.log(Object.isExtensible(obj1));
// obj1.y=2;
// console.log(obj1.y);
// Object.defineProperty(obj1,'z',{value:1});
// console.log(obj1.z);
// var obj={
// x:1,
// y:2,
// username:'unclehuang'
// };
// obj.age=18;
// delete obj.x;
// var o=Object.seal(obj);
// console.log(obj==o);
// console.log(Object.isExtensible(o));
// obj.y=55;
// console.log(obj.y);
// Object.defineProperties(obj,username,{
// get:function(){
// return 'this is a test';
// }
// });
// o.z=77;
// console.log(o.z);
// console.log(o.username);
// delete o.username;
// console.log(o.username);
// // Object.defineProperties(obj,'username',{value:beauty});
// console.log(Object.isSealed(o));
// console.log(o.username);
// console.log(Object.getOwnPropertyDescriptor(obj,'username'));
// var obj={
// prop:function(){},
// foo:'unclehuang'
// };
// obj.test='this is a test';
// delete obj.prop;
// var o=Object.freeze(obj);
// console.log(obj==o);
// console.log(Object.isFrozen(o));
// o.x=1;
// console.log(o.x);
// console.log(o.foo);
// o.f00='beauty';
// console.log(o.foo);
// // 浅冻结
// var obj1={
// internal:{}
// };
// Object.freeze(obj1);
// obj1.internal.x=1;
// console.log(obj1.internal.x);
// // 深冻结
// function deepFreeze(obj) {
// var prop,propKey;
// Object.freeze(obj);
// for(propKey in obj){
// prop=obj[propKey];
// if(!obj.hasOwnProperty(propKey)||!(typeof prop==='object')||Object.isFrozen(prop)){
// continue;
// }
// deepFreeze(prop);
// }
// }
// var obj2={
// internal:{}
// };
// deepFreeze(obj2);
// obj2.internal.x=1;
// console.log(obj2.internal.x);
// // 默认对象是可扩展的,也就是非冻结的
// console.log(Object.isFrozen({}));
// // 不可扩展的对象同时也是冻结的对象
// var obj=Object.preventExtensions({});
// console.log(Object.isFrozen(obj));
// //非空对象默认是非冻结对象
// var obj1={x:1};
// console.log(Object.isFrozen(obj1));
// Object.preventExtensions(obj1);
// console.log(Object.isFrozen(obj1));
// delete obj1.x;
// console.log(Object.isFrozen(obj1));
//一个不可扩展的对象,但是拥有一个可写但不可配置的属性,仍然是非冻结的
var obj2={x:1};
Object.preventExtensions(obj2);
Object.defineProperty(obj2,'x',{writable:false});
console.log(Object.isFrozen(obj2));
//将x变成不可配置
Object.defineProperty(obj2,'x',{configurable:false});
console.log(Object.isFrozen(obj2));
//一个不可扩展的对象,但是拥有一个不可配置但可写的属性,仍然是非冻结的
var obj3={ x:1 };
Object.preventExtensions(obj3);
Object.defineProperty(obj3,'x',{configurable:false});
console.log(Object.isFrozen(obj3));
//将x变为不可写
Object.defineProperty(obj3,'x',{writable:false});
console.log(Object.isFrozen(obj3));
//如果一个不可扩展的对象拥有一个访问器属性,它也是非冻结的
var obj4={
get test(){
return 1;
}
};
Object.preventExtensions(obj4);
console.log(Object.isFrozen(obj4));
Object.defineProperty(obj4,'test',{configurable:false});
console.log(Object.isFrozen(obj4));
var obj5={
x:1
};
Object.freeze(obj5);
console.log(Object.isFrozen(obj5));
console.log(Object.isSealed(obj5));
console.log(Object.isFrozen(obj5));