js对象之一

本文探讨了JavaScript中对象的可扩展性控制,包括如何使用Object.preventExtensions(), Object.seal()和Object.freeze()方法来限制对象的扩展、配置和修改,并提供了检测对象状态的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、对象的可扩展性
1.所有内置对象和自定义对象都是显示可扩展的,宿主对象的可扩展性由JavaScript引擎定义的
2.可以通过Object.preventExtensions()将对象设置为不可扩展的,而且不能再转换为可扩展的了。
Object.isExtensibke()检测对象是否是可扩展的
3.preventExtensions()只影响到对象本身的可扩展性,如果给一个不可扩展的对象的原型添加属性,不可扩展的对象同样会继承这些新属性。
4.Object.seal()和Object.preventExtensions()类似,除了能够将对象设置为不可扩展的,还可以将竖向都设置为不可配置的,也就是说不能给这个对象添加新属性,而且它已有的属性也不可删除,已有的可写属性依然可以设置,可以通过Object.isSealed()检测对象是否封闭
5.Object.freeze()将要严格地锁定对象——冻结。除了对象设置为不可扩展的,还可以将它自身的所有数据属性设置为只读(如果对象的存储器属性具有setter方法,存储器仍可以通过给属性赋值调用他们)。可以使用)Object.isFroze()来检测对象是否冻结。

 // 检测对象是否可扩展
        // var obj={};
        // console.log(Object.isExtensible(obj));
        // var d=new Date();
        // console.log(Object.isExtensible(d));
        // obj.x=1;
        // console.log(obj.x);

        // 通过preventExtensions()将对象变为不可扩展的
        // obj1=Object.preventExtensions(obj);
        // console.log(obj==obj1);
        // console.log(Object.isExtensible(obj1));
        // obj1.y=2;
        // console.log(obj1.y);
        // Object.defineProperty(obj1,'z',{value:1});
        // console.log(obj1.z);

        // var obj={
        //     x:1,
        //     y:2,
        //     username:'unclehuang'

        // };
        // obj.age=18;
        // delete obj.x;
        // var o=Object.seal(obj);
        // console.log(obj==o);
        // console.log(Object.isExtensible(o));
        // obj.y=55;
        // console.log(obj.y);
        // Object.defineProperties(obj,username,{
        //     get:function(){
        //         return 'this is a test';
        //     }
        // });
        // o.z=77;
        // console.log(o.z);
        // console.log(o.username);
        // delete o.username;
        // console.log(o.username);
        // // Object.defineProperties(obj,'username',{value:beauty});
        // console.log(Object.isSealed(o));
        // console.log(o.username);
        // console.log(Object.getOwnPropertyDescriptor(obj,'username'));

        // var obj={
        //     prop:function(){},
        //     foo:'unclehuang'

        // };
        // obj.test='this is a test';
        // delete obj.prop;
        // var o=Object.freeze(obj);
        // console.log(obj==o);
        // console.log(Object.isFrozen(o));
        // o.x=1;
        // console.log(o.x);
        // console.log(o.foo);
        // o.f00='beauty';
        // console.log(o.foo);



        // // 浅冻结
        // var obj1={
        //     internal:{}
        // };
        // Object.freeze(obj1);
        // obj1.internal.x=1;
        // console.log(obj1.internal.x);



        // // 深冻结
        // function deepFreeze(obj) {
        //     var prop,propKey;
        //     Object.freeze(obj);
        //     for(propKey in obj){
        //         prop=obj[propKey];
        //         if(!obj.hasOwnProperty(propKey)||!(typeof prop==='object')||Object.isFrozen(prop)){
        //             continue;
        //         }
        //         deepFreeze(prop);
        //     }
        //   }

        //   var obj2={
        //       internal:{}
        //   };
        //   deepFreeze(obj2);
        //   obj2.internal.x=1;
        //   console.log(obj2.internal.x);

        // // 默认对象是可扩展的,也就是非冻结的
        // console.log(Object.isFrozen({}));
        // // 不可扩展的对象同时也是冻结的对象
        // var obj=Object.preventExtensions({});
        // console.log(Object.isFrozen(obj));
        // //非空对象默认是非冻结对象
        // var obj1={x:1};
        // console.log(Object.isFrozen(obj1));
        // Object.preventExtensions(obj1);
        // console.log(Object.isFrozen(obj1));
        // delete obj1.x;
        // console.log(Object.isFrozen(obj1));
        //一个不可扩展的对象,但是拥有一个可写但不可配置的属性,仍然是非冻结的
        var obj2={x:1};
        Object.preventExtensions(obj2);
        Object.defineProperty(obj2,'x',{writable:false});
        console.log(Object.isFrozen(obj2));
        //将x变成不可配置
        Object.defineProperty(obj2,'x',{configurable:false});
        console.log(Object.isFrozen(obj2));

        //一个不可扩展的对象,但是拥有一个不可配置但可写的属性,仍然是非冻结的
        var obj3={ x:1 };
        Object.preventExtensions(obj3);
        Object.defineProperty(obj3,'x',{configurable:false});
        console.log(Object.isFrozen(obj3));
        //将x变为不可写
        Object.defineProperty(obj3,'x',{writable:false});
        console.log(Object.isFrozen(obj3));

        //如果一个不可扩展的对象拥有一个访问器属性,它也是非冻结的
        var obj4={
            get test(){
                return 1;
            }
        };
        Object.preventExtensions(obj4);
        console.log(Object.isFrozen(obj4));
        Object.defineProperty(obj4,'test',{configurable:false});
        console.log(Object.isFrozen(obj4));

        var obj5={
            x:1
        };
        Object.freeze(obj5);
        console.log(Object.isFrozen(obj5));
        console.log(Object.isSealed(obj5));
        console.log(Object.isFrozen(obj5));
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值