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) 方法会直接在一个对象上定义一 ... 
随机推荐
- 解决:The APR based Apache Tomcat Native library which allows optimal performance in production...
			tomcat日志apr报错引发的基于Tomcat Native加速Tomcat性能 tomact服务启动报错日志如下:息: The APR based Apache Tomcat Native lib ... 
- BZOJ2430 chocolate
			有一个显然的想法是因为最后要花分成n*m个小块,所以每条边一定是要被切开的. 所以直接排序就可以了qwq,按照代价从大到小切一定是最优的. #include<iostream> #incl ... 
- windows kvm虚拟机安装
			这一步操作需要注意的几个点:a.局域网内与主机传输文件用scp或ftp命令,要保证ISO镜像文件在主机上有操作权限的目录下,比如 /home等:b.不管安装什么系统的虚拟机,创建的磁盘类型,分配的虚拟 ... 
- JOISC2019Day 1試験 (Examination)
			题面 官网 题解 就是个裸的三维数点,\(CDQ\)直接套上去就行了 //minamoto #include<bits/stdc++.h> #define R register #defi ... 
- [译文]casperjs的API-clientutils模块
			casper提供了少量的客户端接口用来进行远程DOM环境注入,通过clientutils模块的ClientUtils类实例中的__utils__对象来执行: casper.evaluate(funct ... 
- noip提高组模拟赛(QBXT)T2
			T2count题解 [ 问题描述]: 小 A 是一名热衷于优化各种算法的 OIER,有一天他给了你一个随机生成的 1~n 的排列, 并定 义区间[l,r]的价值为: \[ \huge C_{l,r}= ... 
- MVC软件设计模式
			Model(模型):负责数据维护 View(视图):负责向用户呈现数据 Control(控制):负责模型和视图之间的交互 应用:Struts就是基于MVC模式的架构 
- 使用私有git仓库备份服务器脚本和配置文件
			1. 创建私有git仓库 服务器端配置: # 安装 git yum -y install git # 创建 git 用户 useradd git # 创建私有仓库数据存储目录 mkdir /git_b ... 
- weex 初始化
			文档教程 一. 已有项目集成weex, 有时候会报错, 因为sdk中用到了socket pod 'WeexSDK' pod 'SocketRocket' 二. 在app启动方法 -didFinish ... 
- 获取指定<文字行数>的<高度>是多少  TextKit
			- (CGSize)maxLineSizeWithLines:(NSInteger)lines constraintSize:(CGSize)size attributes:(NSDictionary ... 
