前言现在有这样一个需求:用一个对象来存储一个学生的各科成绩,要求只有该科成绩每次都可以更改,不能添加或删除任何主题。.分析一下,这个需求其实就是需要创建一个固定属性的对象。它的属性不可增删,但属性值是可以改变的。有的同学可能会这样开始:首先,定义一个符合要求的对象://声明成绩存储对象letreportObj={};//将科目添加到成绩存储对象中,并设置科目属性为不可追加并且可删除,但科目成绩可以修改错误,价值:60}});thenWriteresults://保存主题结果reportObj.ChineseMark=99;reportObj.EnglishMark=95;console.log(reportObj);//{ChineseMark:99,EnglishMark:95}删除属性试试:deletereportObj.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如果用作动词,它的解释就是“sealed”:看名字就知道,Object.seal()方法用于“密封”一个对象,它可以防止对象添加新的属性,并将对象的所有现有属性标记为不可配置。当前属性的值可以更改,只要它最初是可写的。通常,对象是可扩展的(可以添加新属性)。密封对象使得无法向对象添加新属性,并且所有现有属性都变得不可配置。使属性不可配置的效果是属性变得不可删除,数据属性不能重新定义为访问器属性,反之亦然。但是属性的值还是可以修改的。尝试删除密封对象的属性或将密封对象的属性从数据属性转换为访问器属性会静默失败或抛出TypeError(在严格模式下最常见,但不是唯一的)。constobject1={property1:42};Object.seal(object1);object1.property1=33;console.log(object1.property1);//预期输出:33deleteobject1.property1;//sealedconsole.log(object1.property1);//expectedoutput:33总结一下,Object.seal()实际上做了以下几件事:设置Object.preventExtension(),禁止添加新属性(绝对存在),将configurable设置为false,并禁止配置(绝对存在)禁止改变访问器属性(getters和setters)语法Object.seal(obj)Parameters参数obj表示要密封的对象。返回值是密封的对象。既然有这么好用的实现需求的方法,我们当然要好好利用,最终可以完美的实现文章开头的需求://声明分数存储对象和itsattributesletreportObj={ChineseMark:60,EnglishMark:60};//密封成绩对象letsealedReportObj=Object.seal(reportObj);//更改主题标记sealedReportObj.ChineseMark=99;sealedReportObj.EnglishMark=97;console.日志(密封报告对象);//{"ChineseMark":99,"EnglishMark":97}验证一下://添加属性sealedReportObj.PhysicsMark=100;console.log(sealedReportObj);//{"ChineseMark":99,"EnglishMark":97}//删除属性deletesealedReportObj.ChineseMark;//falseconsole.log(sealedReportObj);//{"ChineseMark":99,"EnglishMark":97}可以看到对象的属性不能增删改查,是需求的简单实现。扩展如果我们要判断一个对象是否被“密封”,我们可以使用Object.isSealed()方法:Object.isSealed(sealedReportObj);//trueObject.freeze()看到这里,很多同学可能会想到Object.freeze()方法,它的作用是冻结一个对象。实际效果是字面意思:冻结一个对象,使其属性和属性值无法更改。实现这个要求显然是不合适的。Object.seal()和Object.freeze()的共同点是被作用的对象变得不可扩展,这意味着不能再添加新的属性。受影响对象中的每个元素都变得不可配置,这意味着无法删除属性。如果在“使用严格”模式下使用,这两种方法都可能引发错误。不同之处在于Object.seal()允许您修改属性的值,但Object.freeze()不能。综上所述,以上就是对Object.seal()方法的简单介绍和应用,以及它与Object.freeze()的异同。希望对大家有所帮助。~~本文到此结束,感谢阅读!~学习有趣的知识,认识有趣的朋友,塑造有趣的灵魂!大家好,我是〖编程三昧〗的作者王隐,我的公众号是《编程三昧》,欢迎关注,希望大家多多指教!你来,怀揣期待,我以墨香迎接你!您归来,不分得失,只送回味!知识与技能并重,内功与外功并重,理论与实践两手抓,两手都要用力!参考文档:Object.seal()Object.freeze()
