怎么使用创客贴网站做图/seo导航
vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()
来劫持各个属性的setter
,getter
,在数据变动时发布消息给订阅者,触发相应的监听回调。
(在单向绑定的基础上给可输入元素(input、textarea等可以产生数据的html元素)添加了change(input)事件,来动态修改model和 view。)
Object.defineProperty(obj,"属性名",{ 属性描述符 }):
直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。属性描述符分:数据描述符和存取描述符,描述符必须是这两种形式之一,不能同时使用两者。
<script>var obj={};// 给对象obj定义1个name属性,并定义了name属性的set和get方法。//当obj.name的时候会调用name属性的get方法;//给name属性赋值的时候,会调用set方法,这就是修改数据的时候,视图会自动更新的关键.Object.defineProperty(obj,"name",{set:function(val){//val打印出来为jackconsole.log("设置name属性值的时候,该set方法会被自动调用"+val);},get:function(){console.log("获取name属性值的时候,该get方法会被自动调用");return "lucy" //将name的属性值重新设置为lucy.}})obj.name="jack";console.log(obj); //{name:"lucy"}</script>
简单的双向数据绑定:
<label>输入</label><input type="text" id="txt1"/><label>输出</label><input type="text" id="txt2"/><script>var a={};var arr=[];Object.defineProperty(a,"val",{set:function(num){arr["b"]=num; //即等同:[b:txt1.value]},get:function(){return arr["b"]; //将arr["b"] 的值即txt1.value值赋值给了t2.}})var t1=document.getElementById("txt1");var t2=document.getElementById("txt2");t1.onkeyup=function(){a.val=t1.value; //value属性赋值操作,触发set方法:将txt1.value值传给了num形参变量.t2.value=a.val; //value属性读取操作,触发get方法: 将return后面的值赋值给了t2.}</script>
参照:从Object.definedProperty中看vue的双向数据的绑定 - leaf+ - 博客园