JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析

作者:煦涵 时间:2023-09-04 22:44:33 

本文实例讲述了JS Object.preventExtensions(),Object.seal()与Object.freeze()用法。分享给大家供大家参考,具体如下:

一、基本介绍

MethodDescriptionParamDetail
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
  • asp之家 网络编程 m.aspxhome.com