Object.freeze与 Object.seal的区别

MDN文档描述:

Object.freeze:

Object.freeze() 方法冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。

Object.seal:  

Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要可写就可以改变。

通常,一个对象是可扩展的(可以添加新的属性)。密封一个对象会让这个对象变的不能添加新属性,且所有已有属性会变的不可配置。属性不可配置的效果就是属性变的不可删除,以及一个数据属性不能被重新定义成为访问器属性,或者反之。但属性的值仍然可以修改。尝试删除一个密封对象的属性或者将某个密封对象的属性从数据属性转换成访问器属性,结果会静默失败或抛出TypeError(在严格模式 中最常见的,但不唯一)。

Object.seal(obj)后

obj不能添加新属性,也不能删除obj上的属性(也就是descriptor里的不可配置 configurable 变成false了)

但是 writable的属性没有变,也就是说其实还是可以修改值的

Object.freeze(obj)后

值也不能修改了,(也就是decscriptor里的writable也变成false了)

注意,Object.freeze和Object.seal都没有undo的方法,同时也不能再用Object.defineProperty去修改它们的descriptor

原文地址:https://www.cnblogs.com/eret9616/p/11619701.html

时间: 2024-10-18 22:01:10

Object.freeze与 Object.seal的区别的相关文章

[Javascript] Object.freeze() vs Object.seal()

let person = { firstName: "Zhentian", lastName: "Wan" }; /*Object.freeze() makes object cannot be updated, added or deleted*/ let freezePerson = Object.freeze(person); freezePerson.address="Finland"; // Cannot add property ad

ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)

前面提到 ES5 对象属性描述符,这篇看看对象的扩展.密封和冻结. 扩展对象 Object.preventExtensions Object.isExtensible 密封对象 Object.seal Object.isSealed 冻结对象 Object.freeze Object.isFrozen 1. Object.preventExtensions 阻止对象扩展,让一个对象变的不可扩展,也就是永远不能再添加新的属性 ES3 是没有办法阻止对象扩展的,定义对象后可以给对象添加任意属性,如

ECMA5.1中Object.seal()和Object.freeze()的区别

1  Object.seal(O)的调用 When the seal function is called, the following steps are taken:   If Type(O) is not Object throw a TypeError exception.   For each named own property name P of O,      Let desc be the result of calling the [[GetOwnProperty]] int

Object.freeze()

Object.freeze()方法可以冻结一个对象,被冻结的对象不能修改和删除该对象已有的属性,不能对该对象添加新的属性,以及不能修改该对象已有属性的可枚举,可配置性,可写性.该方法返回被冻结的对象.被冻结的对象的属性也不是一定不能修改,如果一个属性的值是一个对象,该属性的值可以修改,称之为浅冻结.要使对象不可变,需要递归冻结每个类型为对象的属性,称为深冻结. 浅冻结 // 冻结对象 var obj = { name: 'zhangsan', age: 20 } // 填加新属性 obj.job

Object.freeze(); 方法冻结一个对象。

Object.freeze() 方法可以冻结一个对象.一个被冻结的对象再也不能被修改: 冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性.可配置性.可写性,以及不能修改已有属性的值. 此外,冻结一个对象后该对象的原型也不能被修改.freeze() 返回和传入的参数相同的对象. 1 const obj = { 2 property: 42 3 }; 4 5 const obj2 = Object.freeze(obj); 6 7 obj.propert

阮一峰老师的JavaScript标准参考教程:Object对象和Object方法

Object对象 1. 概述 1.1 生成方法 对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型. 什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合. var obj = { foo: 'Hello', bar: 'World' }; 上面代码中,大括号就定义了一个对象,它被赋值给变量obj,所以变量obj就指向一个对象.该对象内部包含两个键值对(又称为两个“成员”),第一个键值对是foo: 'Hello',其中f

Redis存储Object 和 list<object>

Redis 存储支持的类型没有object ,虽然有支持list,但是只支持List<String> 有两种方法可以实现存储对象和泛型 1.用序列化和反序列化 2.json 序列化工具类,实现序列化和反序列话对象和list集合 package com; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.Object

【JS】☆★之详解[Object HTMLDivElement]和[Object Object]

[JS]☆★之详解[Object HTMLDivElement]和[Object Object] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">

遍历对象属性(for in、Object.keys、Object.getOwnProperty)

js中几种遍历对象的方法,包括for in.Object.keys.Object.getOwnProperty,它们在使用场景方面各有不同. for in 主要用于遍历对象的可枚举属性,包括自有属性.继承自原型的属性 var obj = {"name":"Poly", "career":"it"} Object.defineProperty(obj, "age", {value:"forever