JavaScript使用Object.defineProperty方法实现双数据绑定
Object.defineProperty这个方法非常值得学习,很多mvc框架中的双向数据绑定就是通过它来实现的。
本着互联网分享精神,今天我就将我自己的见解分享给大家,希望能有所帮助。
开始使用
Object.defineProperty接收三个参数
* 目标对象
* 需要要定义的属性名或方法的名字
* 目标属性所拥有的特性 - descriptor (之后讲解下面案例不包括)
代码实例
var User = {};
Object.defineProperty(User, 'info', {
value: 123
});
console.log(User.info);
descriptor
descriptor接收6个参数
注意事项:如果使用了(value和writable)就不能使用(get和set),他们可以理解为两组参数。如果同时使用就会报错。
另外如果参数中设置configurable 又设置了value,writable,configurable,将会以value,writable,configurable中设置的值为准。
var User = {};
Object.defineProperty(User, "info", {
// value: 123, // 属性的值
// writable: false, // 默认为false 如果值为false那么属性的值就不能被重写,只能读取。
configurable: false,//默认false 如果值为false 就不能再设置或修改他的(value,writable,configurable)
enumerable: false,// 默认false 如果值为false就不能再for..in循环中遍历和 Object.keys() 中被枚举。
// 调用时不传参执行的方法
get: function () {
return 'get'
},
//调用时传参执行的方法
set: function (set) {
return set
}
});
console.log(User.info);//调用get方法输出 get
console.log(User.info = 'aaa');//调用 set 方法 输出 aaa
值的修改
注意事项: configurable=false,但只要是设置了writable 值还是会修改的,如果writable=false,那么两次输出的结果都会是123。
var User = {};
Object.defineProperty(User, "info", {
value: 123,
writable: true,
configurable: false
});
console.log(User.info); // 输出 123
User.info = 456;
console.log(User.info); // 输出 456
enumerable
注意事项如果enumerable=false,那么输出就会是一个空数组、
var User = {};
Object.defineProperty(User, "info", {
value: 123,
enumerable: true,
});
console.log(Object.keys(User)); //输出['info']
实战小案例实现双向数据绑定
html源码
<p>今天天气 : <span id='state'>晴天</span></p>
<div id="clothes"></div>
JavaScript源码
var UserInfo = {};
Object.defineProperty(UserInfo, "state", {
get: function () {
return document.getElementById('state').innerHTML;
},
set: function (nick) {
document.getElementById('state').innerHTML = nick;
}
});
Object.defineProperty(UserInfo, "clothes", {
get: function () {
return document.getElementById('clothes').innerHTML;
},
set: function (clothes) {
document.getElementById('clothes').innerHTML = clothes;
}
});
console.log(UserInfo.state); //输出晴天
UserInfo.clothes = "适合穿短袖";//修改html中的数据
JavaScript使用Object.defineProperty方法实现双数据绑定的更多相关文章
- JavaScript Object.defineProperty()方法详解
Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法 Object.defineProperty(obj, prop ...
- Object.defineProperty方法 使用
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 语法: Object.defineProperty(obj, pr ...
- Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...
- Vue el与data的两种写法 && Object.defineProperty方法
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...
- javascript之Object.defineProperty的奥妙
直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...
- Object.defineProperties()和Object.defineProperty()方法
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 语法:Object.defineProperty(obj, pro ...
- js中Object.defineProperty()方法的解释
菜菜: “老大,那个, Object.defineProperty 是什么鬼?” 假设我们有个对象 user ; 我们要给它增加一个属性 name , 我们会这么做 1 2 3 var user = ...
- ES5 Object.defineProperty 方法
先看一个例子: var o = {}; o.a = 1; // 等待于: Object.defineProperty(o, 'a', { value: 1, writable: true, confi ...
- Object.defineProperty方法
Object.defineProperty() (一次添加/修改一个属性) 用法:Object.defineProperty(obj, prop, descriptor) 方法会直接在一个对象上定义一 ...
随机推荐
- boost::string 例题1
如果有一个语法正确的shader源文件,其包括若干关于uniform变量的定义.请写一个程序从某个shader源文件里提取其全部定义的uniform变量.要求记录其名称.数据类型和初始值(如果有定义) ...
- 用Echarts的力向导图可视化数据
学习背景:做一个图论的题目的时候需要将结果可视化来直观的看效果,所以使用Echarts来画.感觉效果不错. Echarts下载地址:https://echarts.baidu.com/download ...
- 迫不得已! ! 仅仅针对IE浏览器的样式,尤其是IE8及以下
IE10不会起作用,IE9,8,7,6,5都可以 <html> <head> <title>IE打开就是蓝色背景,白色的字体</title> <! ...
- ArchLinux pacman 提高俩倍下载速度方法
pacman能够调用外部下载工具来代替默认的wget来给pacman提速 比如将/etc/pacman.conf中 XferCommand = /usr/bin/wget –passive-ftp - ...
- linux和windows之间的文件压缩和解压缩以及^R的问题
推荐大家使用zip压缩和解压,因为zip一般是linux系统自带: 一.zip和unzip 1. zip压缩 zip -r myfile.zip ./web 将当前目录里的web下的所有文件和文件夹全 ...
- CSS 两个行内块元素,宽度相加刚好等于父盒子容器的元素,但第二个元素掉在第二行解决办法
我们可以发现:两个行内块元素,宽度相加刚好等于父盒子容器的元素,但第二个元素掉在第二行,这是什么问题呢? 我们先来看一下效果: <!DOCTYPE html> <html lang= ...
- The score of 'O' and 'X'
题目描述 注意要点: 使用strlen函数注意加头文件#inlcude <cstring> 循环宏定义for循环#define _for(i,a,b) for(int i=(a);i< ...
- pydicom读取dicom文件报错
之前采用pydicom读取dicom文件一切都很正常,不过最近读取一批数据的时候,会报错 读取代码 file = pydicom.read_file(filepath) data = file.pix ...
- tp5 重定向缺少index.php报错(No input file specified)
转别人的,有用,Mark一下 public 下的.htaccess 修改为 <IfModule mod_rewrite.c> Options +FollowSymlinks -Multi ...
- Hangfire项目
什么是Hangfire Hangfire 是一个开源的.NET任务调度框架,目前1.6+版本已支持.NET Core.个人认为它最大特点在于内置提供集成化的控制台,方便后台查看及监控: 另外,Hang ...