JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
作者:煦涵 时间:2023-09-04 22:44:33
本文实例讲述了JS Object.preventExtensions(),Object.seal()与Object.freeze()用法。分享给大家供大家参考,具体如下:
一、基本介绍
Method | Description | Param | Detail |
---|---|---|---|
Object.preventExtensions() | 让一个对象变的不可扩展,也就是永远不能再添加新的属性 | Object | 详细 |
Object.isExtensible() | 判断一个对象是否是可扩展 | Object | 详细 |
Object.seal() | 让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象。 | Object | 详细 |
Object.isSealed() | 判断一个对象是否是密封的 | Object | 详细 |
Object.freeze() | 冻结一个对象并返回被冻结的对象。冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。 | Object | 详细 |
Object.isFrozen() | 判断一个对象是否被冻结 | Object | 详细 |
二、Object.preventExtensions()
Object.preventExtensions 只能阻止一个对象不能再添加新的自身属性,仍然可以为该对象的原型添加属性。
2.1 设置preventExtensions()
var jb51 = {
name: "zuojj"
};
Object.preventExtensions(jb51);
jb51.url = "https://www.jb51.net";
//Outputs: undefined
console.log(jb51.url);
2.2 严格模式下使用会报错
但是在严格模式下会报错:
"use strict";
var jb51 = {
name: "zuojj"
};
Object.preventExtensions(jb51);
jb51.url = "https://www.jb51.net";
//Outputs: Uncaught TypeError: Can't add property url, object is not extensible
console.log(jb51.url);
2.3 不可以扩展属性,但可以更改已存在属性值
var jb51 = {
name: "zuojj"
};
Object.preventExtensions(jb51);
jb51.url = "https://www.jb51.net";
//Outputs: Uncaught TypeError: Can't add property url, object is not extensible
console.log(jb51.url);
2.4 不能阻止删除(delete)现有属性
var jb51 = {
name: "jb51",
url : "https://www.jb51.net"
};
Object.preventExtensions(jb51);
delete jb51.url;
//Outputs: {name: "jb51"}
console.log(jb51);
2.5 使用Object.defineProperty方法为一个不可扩展的对象添加新属性会抛出异常
var jb51 = {
name: "jb51"
};
Object.preventExtensions(jb51);
jb51 = Object.defineProperty(jb51, "url", {value: "https://www.jb51.net" });
//Outputs: Uncaught TypeError: Cannot define property:url, object is not extensible.
console.log(jb51);
2.6 判断一个对象是否可扩展
var jb51 = {
name: "jb51",
url : "https://www.jb51.net"
};
Object.preventExtensions(jb51);
//Outputs: false
console.log(Object.isExtensible(jb51));
2.7 冻结对象和密封的对象都是不可扩展对象
var jb51 = {
name: "jb51"
},
sealed = Object.seal(jb51),
frozen = Object.freeze(jb51);
//Outputs: false false
console.log(Object.isExtensible(sealed), Object.isExtensible(frozen));
三、Object.seal()
3.1 不可以添加属性,但可以修改属性值
var jb51 = {
name: "zuojj",
url: "https://www.jb51.net"
};
Object.seal(jb51),
jb51.sex = "male";
jb51.name = "jb51";
//Outputs: {name: "jb51", url: "https://www.jb51.net"}
console.log(jb51);
3.2 严格模式下使用会报错
3.3 delete不能删除现有属性
var jb51 = {
name: "jb51",
url: "https://www.jb51.net"
};
Object.seal(jb51),
delete jb51.name;
//Outputs: {name: "jb51", url: "https://www.jb51.net"}
console.log(jb51);
3.4 Object.defineProperty不能扩展对象属性
var jb51 = {
name: "jb51",
url: "https://www.jb51.net"
};
Object.seal(jb51);
Object.defineProperty(jb51, "sex", {value: "male"})
//Outputs: Uncaught TypeError: Cannot define property:sex, object is not extensible.
console.log(jb51);
上面说到密封对象不可扩展,所以会报错
3.5 判断对象是否为密封对象
// 新建的对象默认不是密封的.
var empty = {};
//Outputs: false
console.log(Object.isSealed(empty));
// 空对象 && 不可扩展 === 密封对象.
Object.preventExtensions(empty);
//Outputs: true
console.log(Object.isSealed(empty));
// 非空对象 && 不可扩展对象不会变成密封对象,因为密封对象的所有自身属性必须是不可配置的.
var hasProp = { fee: "fie foe fum" };
Object.preventExtensions(hasProp);
//Outputs: false
console.log(Object.isSealed(hasProp));
// 如果把这个属性变的不可配置,则这个对象也就成了密封对象.
Object.defineProperty(hasProp, "fee", { configurable: false });
//Outputs: true
console.log(Object.isSealed(hasProp));
console.log("-------------");
// 一个密封对象也可以是一个冻结对象,但不是绝对的.
var s1 = {};
Object.seal(s1);
//Outputs: true
console.log(Object.isFrozen(s1));
var s2 = Object.seal({ p: 3 });
//Outputs: false
console.log(Object.isFrozen(s2)); // 属性"p"可写
四、Object.freeze()
4.1 不能添加属性,且不能修改属性值
var obj = {
name: "jb51",
url: "https://www.jb51.net"
};
Object.freeze(obj);
obj.sex = "male";
obj.name = "zuojj";
//Outputs: {name: "jb51", url: "https://www.jb51.net"}
console.log(obj);
4.2 严格模式下使用会报错
4.3 delete不能删除现有属性
var obj = {
name: "jb51",
url: "https://www.jb51.net"
};
Object.freeze(obj);
delete obj.name;
//Outputs: {name: "jb51", url: "https://www.jb51.net"}
console.log(obj);
4.4 判断对象是否被冻结
var obj = {
name: "jb51",
url: "https://www.jb51.net"
};
Object.freeze(obj);
//Outputs: true
console.log(Object.isFrozen(obj));
五、兼容性
Object.preventExtensions(),Object.isExtensible(),
Object.seal(),Object.isSealed(),
Object.freeze(),Object.isFrozen()方法是ES5规范的一部分,IE8及以下低版本浏览器不支持。Oprea不支持。
来源:http://www.zuojj.com/archives/1089.html
标签:JS,Object
0
投稿
猜你喜欢
在ASP处理程序时,进度显示
2008-08-04 13:27:00
在ASP.NET 2.0中操作数据之三十九:在DataList的编辑界面里添加验证控件
2023-07-06 02:02:48
解决python3.6用cx_Oracle库连接Oracle的问题
2023-06-12 02:38:46
段正淳的css笔记(1)分类之间的横竖线
2007-11-01 21:47:00
【启发】不用循环计算1到100的和
2009-03-04 12:16:00
用Dreamweaver MX设计各种网页鼠标样式
2008-10-04 10:18:00
分享css处理浏览器兼容问题上的小技巧
2008-02-03 14:41:00
python使用wxPython打开并播放wav文件的方法
2023-08-23 10:30:58
ASP简单实现数字和字母验证码
2008-10-23 13:52:00
一个简单的像素画小工具
2010-01-01 15:33:00
ASP 使用Filter函数来检索数组
2011-04-30 16:49:00
长期使用中型Access数据库的一点经验
2007-12-21 13:23:00
一个网页设计师的成长经历
2008-05-27 12:38:00
asp中日期时间函数介绍
2013-06-01 20:01:03
有关于IE8 Beta 1两个提醒
2008-05-15 12:32:00
浅谈SQL Server中统计对于查询的影响分析
2012-06-06 20:08:23
SQL Server 安装出错:以前的某个程序安装已在安装计算机上创建挂起的文件操作
2010-02-23 14:48:00
如何优化下面这段代码?
2010-01-23 11:30:00
一个完美网站的101项指标.第四部分.设计
2008-02-29 22:22:00
用Popup窗口建无限级Web页菜单
2023-07-10 20:22:17