最近在看深入浅出VUE.JS,了解到vue的双向工作原理。这里记录一下。
这个方法主要功能:直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
语法: Object.defineProperty(obj, prop, descriptor)
//obj: 需要被操作的目标对象
//prop: 目标对象需要定义或修改的属性的名称
//descriptor: 将被定义或修改的属性的描述符
//简单示例
var obj = new Object();
Object.defineProperty(obj, 'name', {
configurable: false,
writable: true,
enumerable: true,
value: '张三'
})
console.log(obj.name) //张三
几个参数:
writable:
属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false
Enumerable:
此属性是否可以被枚举(使用for...in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。
configurable:
是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false。 这个属性起到两个作用:
-
目标属性是否可以使用delete删除
-
目标属性是否可以再次设置特性
还有最重要的getter和seeter
getter/setter
当设置或获取对象的某个属性的值的时候,可以提供getter/setter方法。
简单的数据双向绑定
<html lang="en">
<head>
<title>双向绑定</title>
<meta charset="UTF-8">
</head>
<body>
<div id="app">
<input type="text" id="txt">
<p id="show-txt"></p>
</div>
</body>
<script>
var obj={}
Object.defineProperty(obj,'txt',{
get:function(){
return obj
},
set:function(newValue){
document.getElementById('txt').value = newValue
document.getElementById('show-txt').innerHTML = newValue
}
})
document.addEventListener('keyup',function(e){
obj.txt = e.target.value
})
</script>
</html>
其实上面的代码有个坑,会造成txt属性无线循环
//改进代码
<html lang="en">
<head>
<title>双向绑定</title>
<meta charset="UTF-8">
</head>
<body>
<div id="app">
<input type="text" id="txt">
<p id="show-txt"></p>
</div>
</body>
<script>
var obj={}
Object.defineProperty(obj,'txt',{
get:function(){
return txt //这里是造成无限循环的主要代码
},
set:function(newValue){
this.obj = newValue
document.getElementById('show-txt').innerHTML = newValue
}
})
document.addEventListener('keyup',function(e){
obj.txt = e.target.value
console.log(obj)
})
</script>
</html>
Comments | NOTHING