Object之defineProperty

场景:

vue2.0中的双向数据绑定是经典的面试题,可是能说明白的又有几个?


基本使用

参数详解

Object.defineProperty(obj,prop,descriptor);
1 obj 需要定义属性的对象prop 定义的属性名称descriptor 被定义的属性描述(此参数是一个对象)​
2 value:设置到属性的值
3 writable: 设置属性是否可写,boolean 类型,默认值 false
4 configurable: 设置属性是否可以配置,boolean 类型,默认值 false.主要有两个功能
5 设置属性是否可以被 delete 删除
6 设置属性是否可以被再次配置.
7 enumerable: 设置属性是否可以被 for in & Object.keys() 枚举出来.默认值是 false
8 ​set: 给属性赋值的setter
9 get: 获取属性值的 getter


常规使用

在使用 set / get 的时候,就不能搭配 value & writable 两个属性了.否则直接报错.

   // 添加数据属性
			var obj = {};
			
			// 1.添加一个数据属性
			Object.defineProperty(obj, "age", {
			    value: 101,
			    writable: true,  // 是否可以写
			    enumerable: true, // 是否可枚举
			    configurable: true   // 配置文件是否可修改
			});
			
		   // 101
			// console.log(obj.age );
			
			// 2.修改数据属性,不可以写
			Object.defineProperty(obj, "age", {
			    writable:false
			});

set和get(不能和value属性一起使用).

	//添加访问器属性
            var obj = {
                name:'小甜甜',
                _age:18
            };
           // 外部只能访问age
			Object.defineProperty(obj, "age", {
			    set: function (x) {
			        this._age = x;
			    },
			    get: function () {
			        return this._age;
			    },
			    enumerable: true,
			    configurable: true
			});
        console.log(obj.age);	

重现v-model

<div>
		    <button id="btn">改变uname</button>
		    <input type="text" id="input">
		    <h1 id="title"></h1>
	</div>

		<script type="text/javascript">
		window.onload=function(){
			    let userinfo = {
			        uname:'小甜甜',
			    };
			    //开始监控
			   // watcher();
			    (function watcher(){
			        Object.defineProperty(userinfo, "uname", {
			        set(value) {
						// 属性值被修改则通知另一个函数
			            updateDom(value);
			        },
			        get(val) {
			          return val;
			        },
			      });
			    })();
			    //更新dom数据
			    function updateDom(value){
			        document.querySelector('#input').value = value;
			        document.querySelector('#title').innerHTML = value;
			    }
			    //给input绑定input事件,实时修改username的值
			    document.querySelector('#input').oninput=function(e){
		
			        let value = e.target.value;
			        userinfo.uname = value;
			    }
			    //当点击button按钮时,修改对象的值,触发defineProperty中set
			    document.querySelector('#btn').onclick=function(){
			        let value = '小甜甜';
			        userinfo.uname = value;
			    }
			}
		</script>

别跑,据说给我一键三联的人写代码都没Bug!

我是飞翔,
愿您日有所长!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值