Object.defineProperty这个方法非常值得学习,很多mvc框架中的双向数据绑定就是通过它来实现的。

  本着互联网分享精神,今天我就将我自己的见解分享给大家,希望能有所帮助。

开始使用

  Object.defineProperty接收三个参数

   *  目标对象

   *  需要要定义的属性名或方法的名字

   *  目标属性所拥有的特性 - descriptor (之后讲解下面案例不包括)

  代码实例

  1. var User = {};
  2. Object.defineProperty(User, 'info', {
  3. value: 123
  4. });
  5. console.log(User.info);

descriptor

  descriptor接收6个参数

  注意事项:如果使用了(value和writable)就不能使用(get和set),他们可以理解为两组参数。如果同时使用就会报错。

  另外如果参数中设置configurable 又设置了value,writable,configurable,将会以value,writable,configurable中设置的值为准。

  1. var User = {};
  2. Object.defineProperty(User, "info", {
  3. // value: 123, // 属性的值
  4. // writable: false, // 默认为false 如果值为false那么属性的值就不能被重写,只能读取。
  5. configurable: false,//默认false 如果值为false 就不能再设置或修改他的(value,writable,configurable)
  6. enumerable: false,// 默认false 如果值为false就不能再for..in循环中遍历和 Object.keys() 中被枚举。
  7. // 调用时不传参执行的方法
  8. get: function () {
  9. return 'get'
  10. },
  11. //调用时传参执行的方法
  12. set: function (set) {
  13. return set
  14. }
  15. });
  16. console.log(User.info);//调用get方法输出 get
  17. console.log(User.info = 'aaa');//调用 set 方法 输出 aaa

  值的修改

  注意事项: configurable=false,但只要是设置了writable 值还是会修改的,如果writable=false,那么两次输出的结果都会是123。

  1. var User = {};
  2.  
  3. Object.defineProperty(User, "info", {
  4. value: 123,
  5. writable: true,
  6. configurable: false
  7. });
  8.  
  9. console.log(User.info); // 输出 123
  10. User.info = 456;
  11. console.log(User.info); // 输出 456

  enumerable

  注意事项如果enumerable=false,那么输出就会是一个空数组、

  1. var User = {};
  2.  
  3. Object.defineProperty(User, "info", {
  4. value: 123,
  5. enumerable: true,
  6. });
  7.  
  8. console.log(Object.keys(User)); //输出['info']

  实战小案例实现双向数据绑定

     html源码

  1. <p>今天天气 : <span id='state'>晴天</span></p>
  2. <div id="clothes"></div>

    JavaScript源码

  1. var UserInfo = {};
  2.  
  3. Object.defineProperty(UserInfo, "state", {
  4. get: function () {
  5. return document.getElementById('state').innerHTML;
  6. },
  7. set: function (nick) {
  8. document.getElementById('state').innerHTML = nick;
  9. }
  10. });
  11.  
  12. Object.defineProperty(UserInfo, "clothes", {
  13. get: function () {
  14. return document.getElementById('clothes').innerHTML;
  15. },
  16. set: function (clothes) {
  17. document.getElementById('clothes').innerHTML = clothes;
  18. }
  19. });
  20.  
  21. console.log(UserInfo.state); //输出晴天
  22. 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. 2018-12-20 第一章初识JAVA-上机

    JAVA初体验之课后练习 一.请写出Java 程序执行过程与编译原理 答:①执行过程:创建.java文件——编译器(JDK环境里的javac.exe文件编译)——输出.class供计算机接受(只有cl ...

  2. nowcoder(牛客网)提高组模拟赛第一场 解题报告

    T1 中位数(二分) 这个题是一个二分(听说是上周atcoder beginner contest的D题???) 我们可以开一个数组b存a,sort然后二分b进行check(从后往前直接遍历check ...

  3. fdisk 磁盘分区

    .[root@test4 ~]# fdisk /dev/sda //对sda磁盘进行分区 Device contains neither a valid DOS partition table, no ...

  4. Hibernate根据方言dialect动态连接多数据库

    Hibernate根据方言dialect动态连接多数据库 由于最近需要在web项目中动态链接不同地址的数据库,且要链接的子数据库的信息在总数据库(即web项目的主数据库)的表中,所以动手写了一个类. ...

  5. sql指定值排在前面

    示例: SELECT COL1 FROM TABLE1 ORDER BY CASE WHEN COL1 = 'A' THEN 1 ELSE 2 END,COL1;//COL1为A的排在最前面,剩下的按 ...

  6. [ActionScript 3.0] 利用ColorTransform实现对象(图片)的曝光过渡效果

    原图效果 过渡效果 这个效果可以用帧动画实现较为简单,只需要调节这个影片剪辑的色彩效果样式里面的高级选项的三个通道值,以下用代码简单测试,可作为文档类: package { import com.tw ...

  7. UIScreen和UIWindow

    UIScreen 和UIWindow UIScreen object defines the properties associated with a hardware-based display 就 ...

  8. HTML-常用标签与表格标签

    超链接标签: <a href="超链接地址" target="_blank">超链接的文字</a> _blank或new是在新网页中打开 ...

  9. 数据库--sql文件

    sql 脚本是包含一到多个 sql 命令的 sql 语句集合 使用 Linux: mysqldump 命令 1.导出数据和表结构: mysqldump -u 用户名 -p 数据库名称 > nam ...

  10. Vue页面加载时,触发某个函数的方法

    需要在加载页面的时候调用生成验证码的click事件函数 解决方法如下,利用Vue中的mounted mounted:function(){ this.createcode();//需要触发的函数 } ...