js中的访问器属性 defineProperty(vue双向绑定的原理)

 <div>
     <input type="text" id="inputVal" placeholder="请输入您的信息">
     <p id="showVal"></p>
  </div>


<script>
//用js实现简单的双向绑定
var data={};
Object.defineProperty(data,'text',{        
    //利用es5的defineProperty的访问器属性来实现
    get(){
        return data
    },
    set(newData){
        document.getElementById("inputVal").value=newData;
        //获得当前元素被修改的value
        document.getElementById("showVal").innerHTML=newData;
        //把修改后的value传递给需要动态显示的元素
    }
})
document.getElementById("inputVal").addEventListener("keyup",(e)=>{      
    //给需要显示双向绑定的元素绑定一个事件
    data.text=e.target.value;
})
</script>

访问器属性:
        1、概念:不直接存储属性值,仅提供对其他数据属性的保护
        2、何时:只要用自定义规则保护属性时
        3、如何:2步:
          1、定义隐藏的数据属性,起别名;实际存储数据
            问题:使用enmuerable隐藏的属性,防for in ,防不住点,别人可用eric._age绕过访问器属性, 
            直接篡改受保护的属性
            解决:使用
          2、定义访问器属性,从受保护的数据属性中读取或修改数据

//此访问器则达到了对数据的保护,不受篡改
 <script>
   //设置访篡改的访问器
function Visitor(name,score,age){
    this.name=name;
    this.age=age;
    var _score="";
    //闭包中的_score等效于Java中的私有属性(仅对象内可用的属性)
    Object.defineProperties(this,{
        score:{
            get(){
            console.log("自动调用get")
            return _score;
            },
            set(val){
                console.log("自动调用set");
                if(val>=60&&val<=100){
                    _score=val;     //把传递的值赋值给_score
                }else{
                    throw new RangeError("传递的分数值不属于合格范围内");
                }
            },
            enumerable:true,//控制能否被for in遍历到
        }
        
    })
    this.score=score;
    Object.seal(this);
    //禁止添加新属性,同时不允许删除
}

var one=new Visitor("xiaoming","68","14");
//one.shuxe="12";
//如果试图添加新属性时则会报错,
//Uncaught TypeError: Cannot add property shuxe, object is not extensible

for(var i in one){           //打印值
    console.log(i+":"+one[i])
}

   
  </script>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值