控制对象状态-preventExtensions,seal,freeze

preventExtensions无法扩展属性

<script>
        //preventExtensions无法扩展属性

        var obj = {
            a: 123,
            p: "hello"
        }

        var og = Object.getOwnPropertyDescriptor(obj,"p");
        console.log(og);

        var oe = Object.preventExtensions(obj);

        var og2 = Object.getOwnPropertyDescriptor(obj,"p");
        console.log(og2);

        obj.c = 456; 
        console.log(obj.c);  //静默失败,无法扩展属性

        //但因为writable=true,故仍能修改value
        obj.a = 789;
        console.log(obj.a);  //789

        //可以删除属性
        console.log(obj);  //{a: 789, p: "hello"}
        delete obj.a;
        console.log(obj);  //{p: "hello"}

        //修改enumberable,静默失败
        var od = Object.defineProperty(obj,"p",{
            enumberable: false
        })
        var og3 = Object.getOwnPropertyDescriptor(obj, "p");
        console.log(og3);

        //可以修改configurable
        Object.defineProperty(obj,"p",{
            configurable: false
        })
        var og4 = Object.getOwnPropertyDescriptor(obj, "p");
        console.log(og4);

        //可以修改writable
        Object.defineProperty(obj,"p",{
            writable: false
        })
        var og5 = Object.getOwnPropertyDescriptor(obj, "p");
        console.log(og5);
    </script>

这里写图片描述

seal无法扩展属性,不可删除属性

<script>
        //seal无法扩展属性,不可删除属性

        var obj = {
            a: 123,
            p: "hello"
        }

        var og = Object.getOwnPropertyDescriptor(obj,"p");
        console.log(og);

        var os = Object.seal(obj);

        var og2 = Object.getOwnPropertyDescriptor(obj,"p");
        console.log(og2);

        obj.c = 456; 
        console.log(obj.c);  //静默失败,无法扩展属性

        //但因为writable=true,故仍能修改value
        obj.a = 789;
        console.log(obj.a);  //789

        //无法删除属性
        console.log(obj);  //{a: 789, p: "hello"}
        delete obj.a;
        console.log(obj);  //{a: 789, p: "hello"}

        //修改enumberable,静默失败
        var od = Object.defineProperty(obj,"p",{
            enumberable: false
        })
        var og3 = Object.getOwnPropertyDescriptor(obj, "p");
        console.log(og3);

        //可以修改writable
        Object.defineProperty(obj,"p",{
            writable: false
        })
        var og4 = Object.getOwnPropertyDescriptor(obj, "p");
        console.log(og4);
    </script>

这里写图片描述

如果是直接将 configurable属性值修改为 false

<script>
        //直接修改configurable为false

        var obj = {
            a: 123,
            p: "hello"
        }

        var og = Object.getOwnPropertyDescriptor(obj,"p");
        console.log(og);

        var cf = Object.defineProperty(obj,"p",{
            configurable:false
        })

        var og2 = Object.getOwnPropertyDescriptor(obj,"p");
        console.log(og2);

        obj.c = 456; 
        console.log(obj.c);  //456

        //但因为writable=true,故仍能修改value
        obj.a = 789;
        console.log(obj.a);  //789

        //可以删除属性
        console.log(obj);  //{a: 789, p: "hello", c: 456}
        delete obj.a;
        console.log(obj);  //{p: "hello", c: 456}

        //修改enumberable,静默失败
        var od = Object.defineProperty(obj,"p",{
            enumberable: false
        })
        var og3 = Object.getOwnPropertyDescriptor(obj, "p");
        console.log(og3);

        //可以修改writable
        Object.defineProperty(obj,"p",{
            writable: false
        })
        var og4 = Object.getOwnPropertyDescriptor(obj, "p");
        console.log(og4);
    </script>

这里写图片描述

freeze无法扩展属性,不可删除属性,不可修改属性

<script>
        //freeze无法扩展属性,不可删除属性,不可修改属性

        var obj = {
            a: 123,
            p: "hello"
        }

        var og = Object.getOwnPropertyDescriptor(obj,"p");
        console.log(og);

        var of = Object.freeze(obj);

        var og2 = Object.getOwnPropertyDescriptor(obj,"p");
        console.log(og2);

        obj.c = 456; 
        console.log(obj.c);  //静默失败,无法扩展属性

        //writable=false,无法修改value
        obj.a = 789;
        console.log(obj.a);  //123

        //无法删除属性
        console.log(obj);  //{a: 789, p: "hello"}
        delete obj.a;
        console.log(obj);  //{a: 789, p: "hello"}

        //修改enumberable,静默失败
        var od = Object.defineProperty(obj,"p",{
            enumberable: false
        })
        var og3 = Object.getOwnPropertyDescriptor(obj, "p");
        console.log(og3);
    </script>

这里写图片描述

但即便如此,仍能通过给原型对象添加属性而增加其属性

<script>
        //通过原型给preventExtensions对象增加属性
        var obj = {};
        Object.preventExtensions(obj);

        var proto = Object.getPrototypeOf(obj);

        proto.t = 'hi';
        console.log(obj.t);  //hi
    </script>

    <script>
        //通过原型给seal对象增加属性
        var obj = {};
        Object.seal(obj);

        var proto = Object.getPrototypeOf(obj);

        proto.t = 'seal';
        console.log(obj.t);  //seal
    </script>

    <script>
        //通过原型给freeze对象增加属性
        var obj = {};
        Object.freeze(obj);

        var proto = Object.getPrototypeOf(obj);

        proto.t = 'freeze';
        console.log(obj.t);  //freeze
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值