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方法实现双数据绑定的更多相关文章

  1. JavaScript Object.defineProperty()方法详解

    Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法 Object.defineProperty(obj, prop ...

  2. Object.defineProperty方法 使用

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 语法: Object.defineProperty(obj, pr ...

  3. Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...

  4. Vue el与data的两种写法 && Object.defineProperty方法

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...

  5. javascript之Object.defineProperty的奥妙

    直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...

  6. Object.defineProperties()和Object.defineProperty()方法

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 语法:Object.defineProperty(obj, pro ...

  7. js中Object.defineProperty()方法的解释

    菜菜: “老大,那个, Object.defineProperty 是什么鬼?” 假设我们有个对象 user ; 我们要给它增加一个属性 name , 我们会这么做 1 2 3 var user = ...

  8. ES5 Object.defineProperty 方法

    先看一个例子: var o = {}; o.a = 1; // 等待于: Object.defineProperty(o, 'a', { value: 1, writable: true, confi ...

  9. Object.defineProperty方法

    Object.defineProperty() (一次添加/修改一个属性) 用法:Object.defineProperty(obj, prop, descriptor) 方法会直接在一个对象上定义一 ...

随机推荐

  1. WEB新手之签到题

    写一写web新手赛的题. 这是签到题,开始时需要耐心等待页面中字母全部出现. 字母全部出现后,会跳转到另一个界面,如上图所示.F12没什么特别的地方,这题应该有点难度. 按往常一样,先抓包. 按英文提 ...

  2. ArrayList用法详解

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  3. 驼峰转大写(javaScript)

    var a = function(s){return s.replace(/([A-Z])/g,"_$1").toUpperCase();} F12控制台可以直接用

  4. python中package机制的两种实现方式

    当执行import module时,解释器会根据下面的搜索路径,搜索module1.py文件. 1) 当前工作目录 2) PYTHONPATH中的目录 3) Python安装目录 (/usr/loca ...

  5. redis存储的数据类型

    key-velue数据结构存储 key   只能是字符串 value 有5种数据leixing. 字符串 string 哈希 hash 列表 list 集合 set 有序集合 zset

  6. 2016级算法第四次上机-G.ModricWang的序列问题 II

    1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限 ...

  7. How to stop UITableView from clipping UITableViewCell contents in iOS 7

    It looks like the view hierarchy changed slightly in ios7 for table view cells. You can try setting ...

  8. (转)Go语言核心36讲之Go语言学习路线

  9. 2.使用ngx_http_auth_basic_module模块为不带认证的资源添加授权

    1.首先需要生成用户名和密码 使用openssl来生成,生成命令(openssl在安装nginx的时候已经安装) echo "kibana:$(openssl passwd -crypt y ...

  10. Dubbo的Api+Provider+Customer示例(IDEA+Maven+Springboot+dubbo)

    项目结构 dubbo-demo dubbo-api:提供api接口,一般存储实体类和接口服务 dubbo-provider:dubbo生产者提供服务,一般存储接口具体实现 dubbo-customer ...