对象类型/操作 | 增加 | 删除 | 修改 |
初始对象 | T | T | T |
不可扩展对象 | F | T | T |
封闭对象 | F | F | T |
冷冻对象 | F | F | F |
一、不可扩展对象
window.onload = function(){
var test = {
name: 'tom',
father: 'bob'
}
/*
* 初始对象
*/
console.log(Object.isExtensible(test));//初始可扩展
console.log(Object.isSealed(test));//初始不是封闭
console.log(Object.isFrozen(test));//初始不冻结
test.age = '29';//可以增
console.log(test.age);
delete test.age;//可以删
console.log(test.age);
test.name = 'alice';//可以改
console.log(test.name);
console.log("=======================================")
/*
* 不可扩展对象
*/
Object.preventExtensions(test);
console.log(Object.isExtensible(test));//不可扩展
test.age = '29';//不可增
console.log(test.age);
delete test.father;//可以删
console.log(test.father);
test.name = 'happy';//可以改
console.log(test.name);
console.log("----------------------------------------")
/*
* 封闭对象
*/
// Object.seal(test);
// console.log(Object.isExtensible(test));//不可扩展
// console.log(Object.isSealed(test)); //封闭
// test.age = '29';//不可增
// console.log(test.age);
// delete test.name;//不可删
// console.log(test.name);
// test.name = 'happy';//可以改
// console.log(test.name);
// console.log("----------------------------------------")
/*
* 冻结对象
*/
// Object.freeze(test);
// console.log(Object.isExtensible(test));//不可扩展
// console.log(Object.isSealed(test)); //封闭
// console.log(Object.isFrozen(test)); //冻结
// test.age = '29';//不可增
// console.log(test.age);
// delete test.name;//不可删
// console.log(test.name);
// test.name = 'happy';//不可改
// console.log(test.name);
// console.log("----------------------------------------")
}
二、密封的对象
window.onload = function(){
var test = {
name: 'tom',
father: 'bob'
}
/*
* 初始对象
*/
console.log(Object.isExtensible(test));//初始可扩展
console.log(Object.isSealed(test));//初始不是封闭
console.log(Object.isFrozen(test));//初始不冻结
test.age = '29';//可以增
console.log(test.age);
delete test.age;//可以删
console.log(test.age);
test.name = 'alice';//可以改
console.log(test.name);
console.log("=======================================")
/*
* 不可扩展对象
*/
// Object.preventExtensions(test);
// console.log(Object.isExtensible(test));//不可扩展
// test.age = '29';//不可增
// console.log(test.age);
// delete test.father;//可以删
// console.log(test.father);
// test.name = 'happy';//可以改
// console.log(test.name);
// console.log("----------------------------------------")
/*
* 封闭对象
*/
Object.seal(test);
console.log(Object.isExtensible(test));//不可扩展
console.log(Object.isSealed(test)); //封闭
test.age = '29';//不可增
console.log(test.age);
delete test.name;//不可删
console.log(test.name);
test.name = 'happy';//可以改
console.log(test.name);
console.log("----------------------------------------")
/*
* 冻结对象
*/
// Object.freeze(test);
// console.log(Object.isExtensible(test));//不可扩展
// console.log(Object.isSealed(test)); //封闭
// console.log(Object.isFrozen(test)); //冻结
// test.age = '29';//不可增
// console.log(test.age);
// delete test.name;//不可删
// console.log(test.name);
// test.name = 'happy';//不可改
// console.log(test.name);
// console.log("----------------------------------------")
}
三、冻结的对象
window.onload = function(){
var test = {
name: 'tom',
father: 'bob'
}
/*
* 初始对象
*/
console.log(Object.isExtensible(test));//初始可扩展
console.log(Object.isSealed(test));//初始不是封闭
console.log(Object.isFrozen(test));//初始不冻结
test.age = '29';//可以增
console.log(test.age);
delete test.age;//可以删
console.log(test.age);
test.name = 'alice';//可以改
console.log(test.name);
console.log("=======================================")
/*
* 不可扩展对象
*/
// Object.preventExtensions(test);
// console.log(Object.isExtensible(test));//不可扩展
// test.age = '29';//不可增
// console.log(test.age);
// delete test.father;//可以删
// console.log(test.father);
// test.name = 'happy';//可以改
// console.log(test.name);
// console.log("----------------------------------------")
/*
* 封闭对象
*/
// Object.seal(test);
// console.log(Object.isExtensible(test));//不可扩展
// console.log(Object.isSealed(test)); //封闭
// test.age = '29';//不可增
// console.log(test.age);
// delete test.name;//不可删
// console.log(test.name);
// test.name = 'happy';//可以改
// console.log(test.name);
// console.log("----------------------------------------")
/*
* 冻结对象
*/
Object.freeze(test);
console.log(Object.isExtensible(test));//不可扩展
console.log(Object.isSealed(test)); //封闭
console.log(Object.isFrozen(test)); //冻结
test.age = '29';//不可增
console.log(test.age);
delete test.name;//不可删
console.log(test.name);
test.name = 'happy';//不可改
console.log(test.name);
console.log("----------------------------------------")
四、深冻结
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>js 深冻结 与 浅冻结</title>
</head>
<body>
<script type="text/javascript">
function deepFreeze(o) {
var prop, propKey
Object.freeze(o) // 首先冻结第一层对象
for (propKey in o) {
prop = o[propKey]
if (!o.hasOwnProperty(propKey) || !(typeof prop === "object") || Object.isFrozen(prop)) {
// 跳过原型链上的属性、基本类型和已冻结的对象.
continue
}
deepFreeze(prop) //递归调用.
}
}
</script>
</body>
</html>