defineProperty
Object提供的方法,用于给对象添加自定义属性具体用法如下:
const obj = { _value: 1 }; Object.defineProperty(obj, 'value', { get: function() { console.log('get方法执行'); return this._value; }, set: function(a) { console.log('set方法执行'); this._value = a; } }) obj.value = 3; console.log(obj.value); console.log(obj._value);
在node中执行结果如下:
下面来分析一下代码
首先定一个对象,并对对象添加一个自定义属性value,同时添加了getter,setter两个函数用来分别控制value属性的修改和获取,
当执行obj.value = 3;
时,会自动调属性的setter方法,将value的修改同步到_value属性上,当执行obj.value
语句获取属性值时,会自动调用getter方法获取方法的返回值;
总结 (参考MDN)
该方法接收三个参数
obj:要添加属性的对象
prop: 要定义的属性
descriptor:要定义或者修改的属性描述符
其中描述符包含以下几种
1.configurable:布尔值,控制属性是否能改变(除了value,writable)及删除
2.enumerable: 布尔值,控制属性是否可枚举,即通过for in循环或者Object.keys访问
3.value:属性值,可以时任何有效JavaScript值
4.writable 布尔值,属性可否通过赋值修改
5.get:属性getter函数,执行时传入this,this值取决于调用者
6.set:属性setter函数,赋值时执行,并传入this
双向绑定
由此可以设计一下数据双向绑定的简单实现:
在数据对象内定义属性,通过对dom绑定事件监听dom内值的变化,并赋值给数据对象,数据对象的改动会调用自身的setter方法,在方法内在动态修改dom内容。
代码如下:
<!-- 简单数据双向绑定实现 --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <div id="root"> <button id='btn'>请求数据</button> </div> </body> <script> const root = document.getElementById('root'); const btn = document.getElementById('btn'); const input = document.createElement('input'); const model = document.createElement('p'); const dataModel = { _value:0, } Object.defineProperty(dataModel, 'value', { configurable: true, set:function(value){ this._value = value; input.value = value; model.innerHTML = `<span>数据模型:</sapn> ${value}`; }, get:function(){ return this._value; } }) btn.addEventListener('click', () => { const range = Math.floor(Math.random(0, 1) * 100); dataModel.value = range; }) input.addEventListener('input',(ev) => { dataModel.value = ev.target.value; }) const initPage = () => { dataModel.value = 100; } initPage(); root.append(input); root.append(model); </script> </html>
描述有点乱,看实现代码更清晰一点,有问题欢迎指正
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。