美文网首页
Object.freeze()作用冻结一个对象

Object.freeze()作用冻结一个对象

作者: 小呆糊总 | 来源:发表于2021-01-07 15:39 被阅读0次
Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;
冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。
此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。

以下内容参照链接:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

const obj = {
  prop: 42
};

Object.freeze(obj);

obj.prop = 33;
// Throws an error in strict mode严格模式下报错

console.log(obj.prop);
// expected output: 42

1.对象冻结

var obj = {
  prop: function() {},
  foo: 'bar'
};

// Vor dem Einfrieren: neue Eigenschaften können hinzugefügt//冻结前:可以添加新属性
// und vorhandene Eigenschaften geändert oder entfernt werden//以及更改或删除现有属性
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;

// Einfrieren
var o = Object.freeze(obj);

// Der Rückgabewert ist dasselbe Objekt, das übergeben wurde返回值与传递的对象相同
o === obj; // true

// Das Objekt ist eingefroren对象已冻结
Object.isFrozen(obj); // === true

// Jetzt schlagen sämtliche Änderungen fehl现在所有更改都失败了
obj.foo = 'quux'; // 改变属性值失败
// 添加属性失败
obj.quaxxor = 'the friendly duck';

// Im strikten Modus lösen solche Versuche TypeErrors aus
//在严格模式下,这样的测试会触发类型错误
function fail(){
  'use strict';
  obj.foo = 'sparky'; //触发器类型错误 löst TypeError aus
  delete obj.foo; // 触发器类型错误löst TypeError aus
delete obj.quaxxor;
  // 返回true,因为从未添加属性
  obj.sparky = 'arf'; //触发器类型错误 löst TypeError aus
}

fail();

// Object.defineProperty更改失败,两个语句都触发TypeError
Object.defineProperty(obj, 'ohai', { value: 17 });
Object.defineProperty(obj, 'foo', { value: 'eit' });

// 原型也不可
// 两个语句都触发TypeError
Object.setPrototypeOf(obj, { x: 20 })
obj.__proto__ = { x: 20 }

2.数组冻结

let a = [0];
Object.freeze(a); // 无法再更改数组

a[0]=1; // 失败
a.push(2); // 失败

// 在严格模式下,这样的测试会触发类型错误
function fail() {
  "use strict"
  a[0] = 1;
  a.push(2);
}

fail();

3.浅冻结

var employee = {
  name: "Mayank",
  designation: "Developer",
  address: {
    street: "Rohini",
    city: "Delhi"
  }
};

Object.freeze(employee);

employee.name = "Dummy"; //失败
employee.address.city = "Noida"; // 在非严格模式下,可以更改子对象的属性

console.log(employee.address.city) //  "Noida"

4.深冻结

function deepFreeze(object) {
  var propNames = Object.getOwnPropertyNames(object);
  for (let name of propNames) {
    let value = object[name];
    object[name] = value && typeof value === "object" ?
      deepFreeze(value) : value;
  }
  return Object.freeze(object);
}

var obj2 = {
  internal: {
    a: null
  }
};

deepFreeze(obj2);

obj2.internal.a = 'anotherValue'; // 失败
obj2.internal.a; // null

5.如果此方法的参数不是对象,则会导致ES5中的类型错误。在ES2015中,非对象参数被视为冻结的普通对象并简单地返回。

> Object.freeze(1)
TypeError: 1 is not an object // ES5 Code

> Object.freeze(1)
1

相关文章

  • JS专题系列之Object.freeze

    一、什么是Object.freeze Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不...

  • Object.freeze()

    Object.freeze(obj)方法可以冻结一个对象。一个被冻结的对象再也不能被修改,冻结了一个对象, 则不能...

  • 前端-工作中积累的方法

    1.想将对象冻结,应该使用Object.freeze方法。 const foo =Object.freeze({}...

  • Object.freeze()作用冻结一个对象

    Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改; 冻结了一个对象则不能向这个...

  • 2019-08-29

    1.Object.freeze() Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能...

  • Es6对象新方法

    Object.freeze() 该方法可以冻结一个对象,冻结对象指的是不能向这个对象,添加属性、删除属性、修改属性...

  • Object.freeze(obj)

    Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对...

  • 理解Object.freeze()方法

    Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对...

  • Object.freeze()冻结一个对象

    Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对...

  • Object.freeze()(冻结一个对象再也不能被修改添加)

    Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对...

网友评论

      本文标题:Object.freeze()作用冻结一个对象

      本文链接:https://www.haomeiwen.com/subject/yeezoktx.html