Object.freeze()

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

浅冻结

// 冻结对象

var obj = {

    name: ‘zhangsan‘,
    age: 20
}

// 填加新属性
obj.job = ‘student‘
console.log(obj)    // { name: ‘zhangsan‘, age: 20, job: ‘student‘ }

obj.friends = {}
console.log(obj)    // { name: ‘zhangsan‘, age: 18, job: ‘student‘, friends: {} }

// 删除属性
delete obj.job
console.log(obj)    // { name: ‘zhangsan‘, age: 20, friends: {} }

// 修改属性
obj.age = 18
console.log(obj)    // { name: ‘zhangsan‘, age: 18, friends: {} }

console.log("*******************************")
var obj2 = Object.freeze(obj)

obj.gender = ‘man‘
obj.name = ‘lisi‘
delete obj.age
console.log(obj)    // { name: ‘zhangsan‘, age: 18, friends: {} }

obj2.gender = ‘man‘
obj2.name = ‘lisi‘
delete obj2.age
console.log(obj2)   // { name: ‘zhangsan‘, age: 18, friends: {} }

// 修改值为对象的属性值

obj.friends.name = ‘mazi‘
console.log(obj)    // { name: ‘zhangsan‘, age: 18, friends: { name: ‘mazi‘ } }
delete obj.friends.name
console.log(obj)    // { name: ‘zhangsan‘, age: 18, friends: {} }

console.log("------------------Array--------------")
// 冻结数组

var arr = [1,2,3,4,5]

arr.push(0)
console.log(arr)    // [ 1, 2, 3, 4, 5, 0 ]

arr.push([6,7])
console.log(arr)    // [ 1, 2, 3, 4, 5, 0, [ 6, 7 ] ]

var arr2 = Object.freeze(arr)
// arr.push(9)
// console.log(arr)    // TypeError: Cannot add property 6, object is not extensible

arr[6].push(0)
console.log(arr)    // [ 1, 2, 3, 4, 5, 0, [ 6, 7, 0 ] ]

深冻结

// 深冻结函数.
function deepFreeze(obj) {

    // 取回定义在obj上的属性名, 返回一个包含该对象所有属性名的数组
    var names = Object.getOwnPropertyNames(obj);
    // 在冻结自身之前冻结属性
    names.forEach(function(name) {
      var value = obj[name];

      // 如果value是个对象,冻结它
      if (typeof value == ‘object‘ && value !== null)
        deepFreeze(value);
    });

    // 冻结自身
    return Object.freeze(obj);
  }

  obj2 = {
    internal: {},
    set(){

    }
  };

  deepFreeze(obj2);
  obj2.internal.a = ‘anotherValue‘;
  obj2.internal.a; // undefined

MDN地址:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

原文地址:https://www.cnblogs.com/peiyanh/p/9579608.html

时间: 2024-11-05 16:28:09

Object.freeze()的相关文章

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

Object.freeze与 Object.seal的区别

MDN文档描述: Object.freeze: Object.freeze() 方法冻结一个对象.一个被冻结的对象再也不能被修改:冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性.可配置性.可写性,以及不能修改已有属性的值.此外,冻结一个对象后该对象的原型也不能被修改.freeze() 返回和传入的参数相同的对象. Object.seal: Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置.当前属性的值只要可写

Object的一堆方法。。w

今天复习es6,又看到Object的一堆方法,与es5的表现又有不一致,耗费了一整天,整理一下: 前几天在司徒正美的书里又看到了es5 Object的字眼,为了向下兼容,大神们也是牛逼的整理出一系列ie仿Object方法,详情看javascript框架设计这本书(大神没有给宣传费): 这是es5的Object的方法: Object.keys  Object.getOwnPropertyNames  Object.getPrototypeOf  Object.defineProperty  Obj

javascript Object类方法的使用

1.获得属性名称 var o = {              p1: 123,               p2: 456           };   Object.keys(o);//获得可枚举的属性名称 // ["p1", "p2"]  Object.getOwnPropertyNames(o); //获得全部属性名称 // ["p1", "p2"] 2.获得属性的信息描述 var o = { p: 'a' };  O

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, prop, descriptor) 参数 obj 需要定义属性的对象. prop 需定义或修改的属性的名字. descriptor 将被定义或修改的属性的描述符. 返回值 返回传入函数的对象,即第一个参数obj 描述EDIT 该方法允许精确添加或修改对象的属性.一般情况下,我们为对象添加属性是通过

JavaScript Object对象

Object对象 1. 介绍 Object对象,是所有JavaScript对象的超类(基类).定义了Js对象的基本方法和属性. 2. 构造函数 2.1 new Object() :返回一个Object实例 2.2 new Object(value) :根据value的值,返回不同的对象(Number.Boolean.String) 参数: ①value {number | bool | string} :一个数字.布尔值或者字符串 返回值: {Number.Boolean.String} 返回一