📜  JavaScript 中的 Object.seal()

📅  最后修改于: 2022-05-13 01:58:09.718000             🧑  作者: Mango

JavaScript 中的 Object.seal()

JavaScript 中的对象和对象构造函数?
在面向对象编程的现实世界中,我们已经知道类和对象的重要性,但与其他编程语言不同,JavaScript 没有其他语言中看到的传统类。但是 JavaScript 有对象和构造函数,它们大多以相同的方式执行相同类型的操作。

  • 构造函数是与“new”关键字一起使用的通用 JavaScript 函数。 JavaScript 中的构造函数有两种类型,即内置构造函数(数组和对象)和自定义构造函数(为特定对象定义属性和方法)。
  • 当我们需要一种方法来创建可以多次使用的对象“类型”而不必每次都重新定义对象时,构造函数会很有用,这可以使用对象构造函数来实现。将构造函数的名称大写以将它们与常规函数区分开来是一种惯例。

例如,考虑以下代码:

Javascript
function Automobile(color) {
  this.color=color;
}
 
var vehicle1 = new Automobile ("red");


Javascript


Javascript


函数“Automobile()”是一个对象构造函数,它的属性和方法,即“color”是通过在它的前面加上关键字“this”来声明的。使用对象构造函数定义的对象然后使用关键字“new”成为即时对象。
当 new Automobile() 被调用时,JavaScript 做了两件事:

  1. 它创建一个新的对象(实例)汽车()并将其分配给一个变量。
  2. 它将对象的构造函数属性(即“颜色”)设置为汽车。

Object.seal() 方法
在 Object 的构造方法中,有一个方法 Object.seal() 用于密封对象。密封对象不允许添加新属性并将所有现有属性标记为不可配置。尽管当前属性的值可以更改,只要它们是可写的。
要密封的对象作为参数传递,该方法返回已密封的对象。

Object.freeze() 方法和 Object.seal() 方法的区别

如果使用 Object.freeze() 方法冻结对象,则其属性将变为不可变,不能对其进行更改,而如果使用 Object.seal() 方法密封对象,则可以在现有的对象的属性。

应用:

  • Object.seal() 用于密封对象和数组。
  • Object.seal() 用于使对象不可变。

句法:

Object.seal(obj)

下面提供了上述函数的示例。

例子:

Input : const obj1 = { property1: 'initial_data'};
        const obj2 = Object.seal(obj1);
        obj2.property1 = 'new_data';
        console.log(obj2.property1);

Output : "new_data"

说明:在此示例中,对象“ob2”已被分配对象“obj1”的属性,并且已被密封,因此无法添加新值。 obj2 的属性 1 的值已更新,因为密封对象允许更改现有属性。

Input : var obj = { prop: function() {}, name: 'adam' };
        console.log(obj);
        obj.name = 'billy';
        delete obj.prop;
        console.log(obj);
        var o = Object.seal(obj);
        delete obj.prop;
        console.log(obj);
        obj.name = 'chris';
        console.log(obj);

Output : Object { prop: function () {}, name: "adam" }
         Object { name: "billy" }
         Object { name: "billy" }
         Object { name: "chris" }

说明:在这个例子中,对象“obj”被分配了“prop: 函数”,因为对象“obj”没有被密封,所以后来被删除了。之后,一个新对象“o”被分配了“obj”的密封值,这阻止了它被删除,但允许更新现有属性。

下面提供了上述函数的代码。

代码 1:

Javascript


输出:

"new_data"

代码 2:

Javascript


输出:

Object { prop: function () {}, name: "adam" }
Object { name: "billy" }
Object { name: "billy" }
Object { name: "chris" }

例外:

  • 如果传递的参数不是对象,则会导致 TypeError。
  • 向密封对象删除或添加属性将失败或抛出 TypeError。
  • 将数据属性转换为访问器或反之亦然将引发 TypeError。

支持的浏览器:

  • 谷歌浏览器 6.0 及以上
  • Internet Explorer 9.0 及更高版本
  • Mozilla 4.0 及更高版本
  • Opera 12 及以上
  • Safari 5.0 及以上
  • 边缘 12 及以上

参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal