var obj={};
console.log(Object.isExtensible(obj));//检测对象是否可扩展
//通过preventExtensions()将对象变为不可扩展的,不能反转为可拓展。
obj1=Object.preventExtensions(obj);
console.log(obj===obj1);//ture
Object.seal();//封闭对象
对象的属性不可配置,设置不可扩展,不可配置。不能添加新属性,已有的可写的属性可以设置。
Object.freeze()//Object.isFroze()检测是否冻结
属性变为只读,不可扩展,不可设置。如果有对象存储器有setter方法,存储器不受影响。
///此时的冻结是浅冻结。
var obj1={
internal:{}
};
object.freeze(obj1);
obj1.internal.x=1;
console.log(obj.internal.x);//1
//深度冻结
function deepFreeze(obj){
var prop,propKey;
Object.freeze(obj);
for(propKey in obj){
prop=obj[propKey];
if(!obj.hasOwnProperty(propKey)||!(typeof prop==='object')||object.isFroze(prop)){
continue;
}
deepFreeze(prop);
}
}
var obj2={
internal:{}
};
deepFreeze(obj2);
obj2.internal.x=1;
console.log(obj2.internal.x);//undefined
console.log(Object.isFrozen({}));//false
//默认对象是可扩展的,也是非冻结的。
var obj=Object.preventExtensions({});
console.log(Object.isfrozen(obj));//true
//一个不可扩展的对象也是一个冻结对象
var obj1={x:1};
console.log(Object.isFrozen(obj1));//false
//一个非空对象默认也是非冻结
Object.preventExtensions(obj1);
console.log(Object.isFrozen(obj1));//false
delete obj1.x;
console.log(Object.isFrozen(obj1));//true
var obj2={x:1};
Object.prenventExtensions(obj2);
Object.defineProperty(obj2,'x',{writable:false});
console.log(Object.isFrozen(obj2));//false
//一个不可扩展的对象,但是拥有一个可写但不可配置的属性,依然是非冻结的
Object.defineProperty(obj2,'x',{configurable:false});
console.log(Object.isFrozen(obj2));//true
//将x变为不可配置
var obj3={x:1};
Object.preventExtensions(obj3);
Object.defineproperty(obj3,'x',{configgurable:false});
console.log(Object.isFrozen(obj3));//false
//如果一个不可扩展的对象,拥有一个不可配置但可写的属性,是非冻结的。
//将x变为不可写
Object.defineProperty(obj3,'x',{writable:false});
console.log(Object.isFrozen(obj3));//true
//如果一个不可扩展的对象拥有一个访问器属性,它也是非冻结的
var obj4={
get test(){
return 1;
}
};
Object.preventExtensions(obj4);
console.log(Object.isFrozen(obj4));//false
Object.defineProperty(obj4,'test',{configurable:false});//true
var obj5={x:1};
Object.freeze(obj5);
console.log(object.isFrozen(obj5));//true
console.log(object.isSealed(obj5));//true
console.log(object.isExtensible(obj5));//false
默认对象是可扩展的,非冻结的。
一个不可扩展的对象也是一个冻结对象。
有属性的对象不是冻结对象。如果是空对象,那么既是不可扩展对象也是冻结对象
26