如何用JavaScript写出只属于你的"对象"

114 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

在平时团队协作的时候,是否遇到过自己写的私有属性被修改了,特别是对象,别人接手后随便的更改,导致本来乱七八糟但有尽然有序的代码正常运行,经过同事的神来一笔,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));

总结

是不是有点迷茫了?没事,这里给大家总结一下,可以加以区分在合适的时候使用,把写出的对象变成自己的。

禁止扩展

不可扩展即不可扩大的意思,从字面抽象出不可添加新属性:

  1. 不可添加新属性
  2. 可修改属性
  3. 可删除属性

封印对象

我把对象封印了起来,外面的进不来–新增属性,里面的出不去–删除属性,但是我自己的属性,虽然在这个"金钟罩"里面出不去,但是可以修改:

  1. 不可添加新属性
  2. 不可删除属性
  3. 可修改属性

冻结对象

对象被冻结,可以把这个对象看做一个冰雕,我只能看,不能对它做任何操作:

  1. 不可添加新属性
  2. 不可删除属性
  3. 不可修改属性