本文已参与「新人创作礼」活动,一起开启掘金创作之路。
在平时团队协作的时候,是否遇到过自己写的私有属性被修改了,特别是对象,别人接手后随便的更改,导致本来乱七八糟但有尽然有序的代码正常运行,经过同事的神来一笔,throw Error了?这篇文章就讲述一下关于Object上的三个高级"私有"属性。
禁止扩展
顾名思义,这个方法呢,可以让你写出的对象被刻意被扩展(不可以被添加新属性)。方法也很简单,使用Object.preventExtensions()即可创建一个不可扩展的对象。该方法接受1个参数,被禁止扩展的对象。对象被禁止扩展后,就永远不能再给它添加新的属性了。我们可以使用Object.isExtensible()检查对象是否被禁止扩展。代码如下:
var obj = {
uname: 'Mike',
age: '20'
}
//阻止扩展
Object.preventExtensions(obj);
//因为上一步阻止了扩展,所以此处返回false,意为不可扩展
console.log(Object.isExtensible(obj));
//尝试重新添加属性
obj.gender = '男';
//检测Object中是否含有gender属性,结果为false,不存在
console.log('gender' in obj);
对象封印
"封印"是它的核心,看过古装片或者打游戏的应该都知道,比克大魔王被魔风波"封印"之后,只可听说传闻,却不见其人(魔)。对于对象也类似,被封印的对象不仅不可扩展,而且其所有属性都不可配置。也就是说,不能给对象添加新属性,也不能删除已有属性或改变其类型,只能读写它的属性。
我们可以通过使用Object.seal()方法来封印一个对象。对象被封印后,其[[Extensible]]特性被设置为false,其所有属性的[[Configurable]]特性被设置为false。可以用Object.isSealed()判断一个对象是否被封印。代码如下:
var obj = {
uname: 'Mike',
age: 20,
gender: '男'
}
//先检测对象是否被封印,返回false,即Object没有被封印
console.log(Object.isSealed(obj));
// 用seal封印obj
Object.seal(obj);
// 此时检测结果为true,表示当前对象被封印
console.log(Object.isSealed(obj));
// 修改obj的属性
obj.age = 22;
// 得到的结果为 age = 22
console.log(obj);
对象冻结
创建不可扩展对象的最后一种方法是冻结它。如果一个对象被冻结,则不能在其上添加或删除属性,不能改变属性类型,也不能写入任何数据属性。简而言之,被冻结对象是一个数据属性都为只读的被封印对象。我们可以使用Object.freeze()来冻结一个对象,用Object.isFrozen()来判断一个对象是否被冻结。代码如下:
var obj = {
uname: 'Mike',
age: 18
};
// 判断是否被冻结,返回结果为false
console.log(Object.isFrozen(obj1));
// 冻结对象
Object.freeze(obj1);
// 判断是否被冻结,返回结果为true
console.log(Object.isFrozen(obj1));
总结
是不是有点迷茫了?没事,这里给大家总结一下,可以加以区分在合适的时候使用,把写出的对象变成自己的。
禁止扩展
不可扩展即不可扩大的意思,从字面抽象出不可添加新属性:
- 不可添加新属性
- 可修改属性
- 可删除属性
封印对象
我把对象封印了起来,外面的进不来–新增属性,里面的出不去–删除属性,但是我自己的属性,虽然在这个"金钟罩"里面出不去,但是可以修改:
- 不可添加新属性
- 不可删除属性
- 可修改属性
冻结对象
对象被冻结,可以把这个对象看做一个冰雕,我只能看,不能对它做任何操作:
- 不可添加新属性
- 不可删除属性
- 不可修改属性