Object.freeze()

Posted peiyanh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Object.freeze()的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法 Object.freeze() 一个 JavaScript 日期?

Object.Freeze Javascript [重复]

Object.freeze

我可以从 object.freeze 导入一种方法吗

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

自己封装一个Object.freeze()方法