JS-Object.defineProperty

11 篇文章 0 订阅

1. Object.defineProperty 简介

在这里插入图片描述

  • 不可配置:

var a = 10 挂载到 window 上,执行 delete a 结果为false,

  • 枚举属性:
var obj = {
       name : 'tzh',
       age : 20,
       __proto__ : {
         nihao : 'good'
       }
     }

     for(var prop in obj){
       console.log(prop) // 打印结果为 name age nihao 
     }

Object.prototype 是不可枚举的

2. Object.defineProperty 定义规则

代码示例:

var obj = {
	name : 'LOL'  // 定义初始值;会被后面的 value 属性覆盖
}
Object.defineProperty(obj,'name',{
       value : 'tzh', //属性值
       writable : false, //不可写
       configurable : true, //可配置
       enumerable : true //可枚举
     })

set 和 get 的用法:

使用 set 和 get 的时候不能 跟 value 和 writable 一起使用要不然会冲突报错。

var assign = '' 
     var obj = {}
     Object.defineProperty(obj,'name',{
       configurable : true,
       enumerable : true,
       get : function (){
         return assign
       },
       set : function (newValue){
          assign = newValue
       }
     })
     obj.name = 10 //  设置值会调用 set 方法
     console.log(obj.name) //读取值会调用 get 方法

set 和 get 简化示例:

var obj = {
       assign : 'tzh',
       set name (newValue){
         this.assign = newValue
       },
       get name () {
         return this.assign
       }
    }
     obj.name = 10
     console.log(obj.name)

3. Object.defineProperty 数据劫持(双向数据绑定思想)

视图层:

	<input type="text" id="inp">
    <div class="text">123</div>

双向数据绑定思想模拟:

	var inp = document.getElementById('inp')
    var odiv = document.getElementsByClassName('text')[0]
    
 	var oData = { 
        ovalue : '',
        age : '19'
    }
    function updata(){ // 视图层数据更新函数
        odiv.innerText = oData.ovalue
    }

    inp.oninput = function () {
       oData.ovalue = this.value
    }

    function Hijacked (data){
       if(!data || typeof data != 'object') return data
       Object.keys(data).forEach(function(key){
            define(data,key,data[key])
       })
    }
    function define(data,key,val){  // 时刻监听数据变化
        //一般数据结构更加复杂,数据嵌套层次更深,递归循环拿到更深层次的数据,
        Hijacked (val)
        Object.defineProperty(data,key,{
            set : function(newValue){
                if(newValue == data[key]) return 
                val = newValue
                updata()
            },
            get : function(){
                return val
            }
        })
    }
    Hijacked(oData)

视图数据变化,浏览器的内存相应数据也会发生变化,浏览器的内存发生变化,视图层数据也会发生变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值