WithCoderWithCoderWithCoder

Javascript对象的可扩展性

    在Javascript中,对象的“可扩展性”用以表示是否可以给对象添加新属性。

    所有的内置对象和自定义对象都是显式可扩展的,宿主对象的可扩展性是由相应的Javascript引擎定义的。在ECMAScript 5中,所有的内置对象和自定义对象都是可扩展的,除非将它们转换为不可扩展的,同样,宿主对象的可扩展性也是由实现ECMAScript 5的Javascript引擎定义的。

    下面介绍三种设置对象不可扩展的方法:

    1. 禁止对象可扩展性Object.preventExtensions()函数

    如果想将对象转换为不可扩展的,可以调用Object.preventExtensions()函数,将要转换的对象作为参数传进去。

    在ECMAScript 5中,通过将对象传入Object.isExtensible()函数,来判断对象是否是可扩展的。

    举例如下:   

    <script>
        var o = {
            name: 'neil'
        };

        // 将对象o转换为不可扩展
        Object.preventExtensions(o);

        // 判断对象o是否是可扩展的
        console.log(Object.isExtensible(o)); // 返回false
    </script>

    注意:

    1. 一旦将对象转换为不可扩展的,就没有相应的方法再将其转换回可扩展的了。

    2. Object.preventExtensions()只影响对象本身的可扩展性。如果给一个不可扩展的对象的原型添加属性,这个不可扩展的对象还是会继承这些新增的属性。

    可扩展属性的目的是为了将对象“锁定”,以避免外界的干扰。对象的可扩展性通常和属性的可配置性与可写性配合使用。

    2. 封闭对象Object.seal()函数

    此外,ECMAScript 5中还提供了Object.seal()函数,它的功能和Object.preventExtensions()函数类似,除了能够将对象设置为不可扩展之外,还可以将对象的所有自有属性都设置为不可配置的。也就是说,不能给这个对象添加新属性,而且它已有的属性也不能删除或配置,不过它已有的可写属性依然可以设置。

    对于已经封闭(sealed)的对象,同样是不能解封的。我们可以使用Object.isSealed()函数来检测对象是否已经封闭。

    举例如下:    

    <script>
        var o = {
            name: 'neil'
        };

        // 将对象o封闭,对象不可配置,对象属性不能删除或配置
        Object.seal(o);

        // 判断对象o已封闭
        console.log(Object.isSealed(o)); // 返回 true
    </script>

    3. 冻结对象Object.freeze()函数

    Object.freeze()函数会更严格的锁定对象----“冻结”。它除了将对象设置为不可扩展的和将其属性设置为不可配置的之外,还可以将它自有的所有数据属性设置为只读(如果对象的存取器属性具有setter方法,存取器属性将不受影响,仍可以通过给属性赋值调用它们)。

    使用Object.isFrozen()函数来检测对象是否冻结。

    举例如下

    <script>
        var o = {
            name: 'neil'
        };

        // 将对象o冻结,对象不可配置,对象所有自有数据属性不能配置和只读
        Object.freeze(o);

        // 判断对象o已冻结
        console.log(Object.isFrozen(o)); // 返回 true
    </script>    

欢迎分享交流,转载请注明出处:WithCoder » Javascript对象的可扩展性