前言

当初有这样一个需要:用一个对象存储某学生的各科问题,要求每次只能扭转科目分数,不能再增加或者删除科目。

剖析一下,这个需要其实就是须要创立一个固定属性的对象,其属性不可增删,但属性值可更改。

有些同学可能就这么开始了:

  • 首先,定义一个符合要求的对象:
// 申明问题存储对象let reportObj = {};// 给问题存储对象增加科目,并设置科目属性不可增删,但科目问题可批改Object.defineProperties(reportObj, {    ChineseMark: {        enumerable: true,        writable: true,        configurable: false,        value: 60    },    EnglishMark: {        enumerable: true,        writable: true,        configurable: false,        value: 60    }});
  • 而后写入问题:
// 存入科目问题reportObj.ChineseMark = 99;reportObj.EnglishMark = 95;console.log(reportObj);  // {ChineseMark: 99, EnglishMark: 95}

删除属性来试试:

delete reportObj.ChineseMark;  // falseconsole.log(reportObj);  // {ChineseMark: 99, EnglishMark: 95}

貌似的确符合条件了,那么再试试减少属性吧:

reportObj.PhysicsMark = 100;console.log(reportObj);  // {ChineseMark: 99, EnglishMark: 95, PhysicsMark: 100}

咋回事,怎么忽然就不太符合要求了呢?Object.defineProperties() 只能准确管制所削减的属性的特质,但如果给对象增加属性的话,它就有力管制了。

明天咱们就用简略的接口办法来实现一下这幺蛾子需要 ︿( ̄︶ ̄)︿

Object.seal()

形容

seal 如果作动词,那它的解释就是“密封”:

见名知意,Object.seal() 办法就是用来“密封”一个对象的,它阻止对象增加新属性,并将对象所有的现有属性标记为不可配置。以后属性的值只有原来是可写的就能够扭转。

作用

通常,一个对象是可扩大的(能够增加新的属性)。

密封一个对象会让这个对象变的不能增加新属性,且所有已有属性会变的不可配置。属性不可配置的成果就是属性变的不可删除,以及一个数据属性不能被从新定义成为拜访器属性,或者反之。但属性的值依然能够批改。

尝试删除一个密封对象的属性或者将某个密封对象的属性从数据属性转换成拜访器属性,后果会静默失败或抛出 TypeError(在严格模式 中最常见的,但不惟一)。

const object1 = {    property1: 42};Object.seal(object1);object1.property1 = 33;console.log(object1.property1);// expected output: 33delete object1.property1; // cannot delete when sealedconsole.log(object1.property1);// expected output: 33

总结起来,Object.seal() 其实就是做了以下事件:

  • 设置Object.preventExtension(),禁止增加新属性(相对存在)
  • 设置configurable为false,禁止配置(相对存在)
  • 禁止更改拜访器属性(getter和setter)

语法

Object.seal(obj)

参数

参数 obj 代表将要被密封的对象。

返回值

被密封的对象。

实现需求

既然有这么好用的办法,那咱们当然要好好利用一番啦,终于能够完满实现文章结尾的需要了:

// 申明问题存储对象及其属性let reportObj = {       ChineseMark: 60,    EnglishMark: 60};// 密封问题对象let sealedReportObj = Object.seal(reportObj);// 更改科目分数sealedReportObj.ChineseMark = 99;sealedReportObj.EnglishMark = 97;console.log(sealedReportObj); // {"ChineseMark": 99, "EnglishMark": 97}

验证一下:

// 减少属性sealedReportObj.PhysicsMark = 100;console.log(sealedReportObj); // {"ChineseMark": 99, "EnglishMark": 97}// 删除属性delete sealedReportObj.ChineseMark; // falseconsole.log(sealedReportObj); // {"ChineseMark": 99, "EnglishMark": 97}

能够看到对象的属性的确是增删不了了,算是简略实现了需要吧。

扩大

如果要判断一个对象是否“密封”,咱们能够应用 Object.isSealed() 办法:

Object.isSealed(sealedReportObj); // true

Object.freeze()

看到这里,可能很多同学都想起了 Object.freeze() 办法,它的作用是用来解冻一个对象。理论作用就是字面意思:解冻一个对象,使其属性和属性值都不可更改。用来实现这个需要显然是不适合的。

共同点

Object.seal()Object.freeze() 有以下共同点:

  • 作用的对象变得不可扩大,这意味着不能再增加新属性。
  • 作用的对象中的每个元素都变得不可配置,这意味着不能删除属性。
  • 如果在 ‘use strict’ 模式下应用,这两个办法都可能抛出谬误。

不同点

Object.seal() 能让你批改属性的值,但 Object.freeze() 不能。

总结

以上就是对于 Object.seal() 办法的一些简略介绍和利用,以及它和 Object.freeze() 的异同点,心愿能对大家有所帮忙。

~

~本文完,感激浏览!

~

学习乏味的常识,结识乏味的敌人,塑造乏味的灵魂!

大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢送关注,心愿大家多多指教!

你来,怀揣冀望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!

常识与技能并重,内力和外功兼修,实践和实际两手都要抓、两手都要硬!

参考文档:

Object.seal()

Object.freeze()