ES6代理实现对象数据保护

本文介绍了如何在ES3、ES5及ES6中保护对象属性不被修改。ES3使用自定义get和set方法;ES5利用Object.defineProperty进行写保护;ES6则引入了Proxy对象提供更优雅的解决方案。

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

在ES3中,为了防止js调用修改对象内部属性,可以采取下面的方式:

<!DOCTYPE html>
<html>
<head> 
    <meta charset="utf-8">
    <title>ES6代理</title>
    <script type="text/javascript">
        {
            // ES3
            var Person = function(){
                var data = {
                    name : 'huangbaokang',
                    age : 29,
                    sex : 'male'
                }
                this.get = function(key){
                    return data[key];
                }
                this.set = function(key,value){
                    if(key!='sex'){
                        data[key]=value;
                    }
                }

            }

            var hbk = new Person();
            console.log(hbk.get("name"));
            console.log(hbk.get("age"));
            hbk.set("name","zhanglulu");
            console.log(hbk.get("name"));
            hbk.set("sex","female");
            console.log(hbk.get("sex"));
        }
    </script>
</head> 
<body>
      
</body>
</html>

浏览器输出:可见,性别属性sex得到了保护,没有被修改。
这里写图片描述

在ES5中,还可以通过定义属性的方式进行写保护。如下:

<!DOCTYPE html>
<html>
<head> 
    <meta charset="utf-8">
    <title>ES6代理</title>
    <script type="text/javascript">
        {
            // ES5
            var Person = {
                name : "huangbaokang",
                age : 29,
            }
            Object.defineProperty(Person,"sex",{
                value : "male",
                writable : false
            })

            Person.name = "zhanglulu";
            console.log(Person.name);
            Person.sex = "female";
            console.log(Person.sex);
        }
    </script>
</head> 
<body>
      
</body>
</html>

浏览器输出,可见name是可以修改,但sex被保护了。
这里写图片描述

在ES6中,采用代理的方式,更加优雅。

<!DOCTYPE html>
<html>
<head> 
    <meta charset="utf-8">
    <title>ES5和ES6代理</title>
    <script type="text/javascript">
        {
            // ES6 代理实现对象属性保护
            let Person = {
                name : "huangbaokang",
                age : 29,
                sex : "male"
            }

            let p = new Proxy(Person,{
                get(target,key){
                    return target[key];
                },
                set(target,key,value){
                    if(key!='sex'){
                        target[key]=value;
                    }
                }

            })
            // 操作代理对象,而不是操作原始对象
            console.log(p);
            console.log(p.name);
            p.name = "zhanglulu";
            console.log(p.name);
            // 修改性别
            p.sex = "female";
            console.log(p.sex);

        }
    </script>
</head> 
<body>
      
</body>
</html>

浏览器输出:,可见性别sex没有被修改,取到了保护的作用。
这里写图片描述

专业墙纸贴纸厨房用具装饰出售,本人网店经营,访问即是爱

博客对你有用记得访问下哦,增加下访问量,如有需要可以下单购买哦^_^。店铺地址https://item.taobao.com/item.htm?id=570637716145

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黄宝康

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

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

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

打赏作者

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

抵扣说明:

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

余额充值