前言

现在有这样一个需求:用一个对象存储某学生的各科成绩,要求每次只能改变科目分数,不能再添加或者删除科目。

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

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

  • 首先,定义一个符合要求的对象:
// 声明成绩存储对象
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;  // false
console.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 sealed
console.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; // false
console.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()

正经人一辈子都用不到的 JavaScript 方法总结 (二)相关推荐

  1. 正经人一辈子都用不到的 JavaScript 方法总结 (一)

    前言 假如有这样一个需求:要求将给定的一个文件路径 D:\bianchengsanmei\blogs\categories\JavaScript 在页面展示出来. 最基本的实现方法可能是下面这个: & ...

  2. jrtplib 打包做了哪些事_30岁前就实现财务自由的人,都做了哪些事

    作者|一磊 [媛创写作变现营]学员 前段时间,身价过亿的28岁程序员郭宇从字节跳动退休,现旅居日本开温泉酒店的事情引发人们热议. 确实,一个28岁的人,没有特殊的背景,做程序员身家过亿,在这个年纪就选 ...

  3. 他用1年时间,从负债6万到年入百万:最会赚钱的人,都在做这件事

    最近听到这样一种说法:世界上90%的问题都能用钱来解决,剩下10%的问题,也能用钱来缓解. 不能同意再多. 也许你会说:你说得倒轻巧,哪有那么容易做到啊. 的确,对大部分人来说,只有一份工资收入,想要 ...

  4. 把自己当成打工的,一辈子都是打工的!:周鸿祎

    我希望大家这样来理解创业,把创业看成是一种心态,为了实现一个目标,孜孜不倦的去追求.只要你不满足于现状,想法设法去突破,那就是创业.如果你是一个在校学生,是搞电脑,如果你不满足于只是把学分学好,不满足 ...

  5. 懂得一些基本常识,就不会被《非酒精類致命飲料》或者叫做《我一辈子都不再喝可口可乐》的这篇文章所蒙蔽...

    懂得一些基本常识,就不会被<非酒精類致命飲料>或者叫做<我一辈子都不再喝可口可乐>的这篇文章所蒙蔽. 首先,原文说"除去衣物的油脂:将整罐可乐倒在一堆油腻的衣物,加入 ...

  6. 谁说程序员赚得比医生少?网友:我一年的收入医生一辈子都赚不到

    最近,某阿里程序员在脉脉上发布了自己的收入情况,并直言协和医院的主治医生一辈子都赚不到这么多钱.此言论立刻引起了大家的热议,评论数超过500条,如下图所示: 以上可以看出,楼主在阿里里面是P7级别,每 ...

  7. 获取当地天气_6 点起来看天气预报?正经人谁看天气预报,原来是为了看她

    往期文章回顾: 日本最美混血记者,用翘臀征服 NBA,万千人沦陷:我好了​mp.weixin.qq.com九头身模特,牛仔裤女王,却也是恶女?菜菜绪了解一下​mp.weixin.qq.com 「小睡」 ...

  8. “凡事不发朋友圈的人,都是过的不好的人”你认同这句话吗为什么?

    我不认同凡事不发朋友圈的人,都是过得不好的人?恰恰相反,凡事不发朋友圈的人,大部分都是过得很好的人! 本人大约是在2012年开始接触微信,之前跟老板开车,好像老板娘因为充话费还是办业务,送了一台智能机 ...

  9. 想法越多越贫穷,赚钱的人,都是少想多干

    说实话,赚钱是个特别枯燥的过程,而且经常需要去做一些重复,看起来没啥作用的事情. 很多人去创业,为啥失败居多呀? 就是做之前,想象很美好,真的去干了,发现完全不是那么回事. 电影里的创业,一般老板都是 ...

最新文章

  1. centos7配置jdk1.8环境变量
  2. *【HDU - 1242 】 Rescue (反向dfs,或bfs)
  3. [leetcode]从中序与后序/前序遍历序列构造二叉树
  4. SpringBoot2 集成 xxl-job任务调度中心_阻塞策略
  5. python生成簇_不调包用PYTHON写GMM(高斯混合模型)算法
  6. 斯坦福人工智能与图像处理_斯坦福大学设计新型AI摄像头,能更快对图像进行分类...
  7. 方程求全微分结果和法向量、切向量的关系
  8. 爱荷华州立大学计算机科学,爱荷华州立计算机科学庆祝成立50周年
  9. iOS开发:图标生成器Prepo 的使用
  10. apollo之集群部署(二)
  11. 利用SHA-1算法和RSA秘钥进行签名验签(带注释)
  12. 1-1 Java基础和编程概述
  13. python实现单机斗地主手机版下载_单机斗地主(单机版)无需网络下载
  14. 如何关闭苹果手机自动扣费_手机自动扣费?三招教你关闭
  15. 如何包含鼠标指针(箭头)截图或者录屏?
  16. FaE:基于符号知识的适应性和可解释的神经记忆
  17. 学计算机的男生是不是都不擅长交际,为什么大多数程序员都是男的?
  18. 【分享】给大家看一下真正的【二叉树结构】是什么样的
  19. 一台计算机连接两个投影,如何实现多台电脑连接一台投影仪并快速切换
  20. 10天免登录操作,保存/取消cookie

热门文章

  1. 解决为什么已经设置了request.setCharacterEncoding(“utf-8“);POST请求仍然乱码的问题
  2. 使用jQuery在AJAX请求中添加标头
  3. 在Objective-C中,如何测试对象类型?
  4. 是否有“他们的”版本的“git merge -s ours”?
  5. Win10重装后电脑关不了机如何解决
  6. U 盘无法拷贝大于 4GB 文件的解决方法
  7. Matlab 变量保存csv:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xfb in position 4: illegal multiby
  8. wos 文献被引_全世界最权威的文献检索工具,这6个检索技巧必须要掌握!
  9. 全向轮机器人特性分析
  10. python之修改pip为豆瓣源