关于javascript的freeze的扩展性二

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
var obj={
prop:function(){},
name:'liye'
};
obj.test='this is test';
delete obj.name;
var o=Object.freeze(obj);
console.log(obj===o);//true
/*
* 这里势必封闭更加严重的就是冻结
* 冻结之后的任何操作都会失败
* 默认对象是可以扩展的 一个不可扩展的也是一个冻结的对象
* 一个非空对象也是非冻结的
*/
// 注意、
//一个非扩展的  但是拥有一个可写但不可配置的属性 任然是非冻结的
var obj3={
x:99
};
//是当前对象变成不可扩展的
Object.preventExtensions(obj3);
//修改当前对象的属性
Object.defineProperty(obj3,'x',{writable:false});
//判断一个对象是否是冻结的
console.log(Object.isFrozen(obj3));//false
// 但是将这个变为不可配置 就是冻结的
Object.defineProperty(obj3,'x',{cofigurable:false});
console.log(Object.isFrozen(obj3));//????
// 若是一个不可扩展的对象 拥有访问器的属性 也是非冻结的
//              如果变成不可配置的 也是冻结的
var obj4={
get test(){
return 1;
}
};
Object.preventExtensions(obj4);
console.log(Object.isFrozen(obj4));//false
// 浅冻结
/*
这里是一个对象obj1包含一个对象test
obj冻结之后 并没有冻结test对象 
*/
var obj1={
test:{}
};
Object.freeze(obj1);
obj1.test.x=22;
console.log(obj1.test.x);//输出22

// 深冻结
function deepFreeze(obj){
var prop,propKey;
Object.freeze(obj);
for(propKey in obj){
prop=obj[propKey];
//hasOwnProperty()检测一个对象是否含有特定的自身属性,和 in 运算符不同,
//该方法会忽略掉那些从原型链上继承到的属性。
if(!obj.hasOwnProperty(prop)||typeof prop==='object'){
continue;
}
deepFreeze(prop);
}
}
var obj2={
test:{}
};
deepFreeze(obj2);
obj2.test.x=44;
console.log(obj2.test.x);
</script>
</head>
<body>
</body>
</html>

你可能感兴趣的:(关于javascript的freeze的扩展性二)