zoukankan      html  css  js  c++  java
  • ES5 Object.defineProperty 方法

    先看一个例子:

    var o = {};
    o.a = 1;
    // 等待于:
    Object.defineProperty(o, 'a', {
      value: 1,
      writable: true,
      configurable: true,
      enumerable: true
    });
    
    Object.defineProperty(o, 'a', { value: 1 });
    // 等待于:
    Object.defineProperty(o, 'a', {
      value: 1,
      writable: false,
      configurable: false,
      enumerable: false
    });

    下面详细描述这些参数的意义:

    configurable

    false(默认)

    true
    1) 对象的描述可以修改或者增加, 描述包括 configurable enumerable set get value

    2) obj.b 是可以删除的, delete(obj.b);

    下面的例子设置为 false 以后, 再设置 上面的那些属性都会报错。

    var o = {}
    Object.defineProperty(o, 'b', {
      configurable: false
    });
    Object.defineProperty(o, 'b', {
      configurable: true
    }); // thrown error
    Object.defineProperty(o, 'b', {
      enumerable: false
    }); // thrown error

    enumerable

    false(默认)
    true, 代表是可以枚举的

    value

    undefined(默认)
    obj 的属性的值

    writable
    false(默认)
    true, 代表这个值可以修改, 修改值不受 configurable 影响

    var o = {}
    Object.defineProperty(o, 'b', {
      configurable: false,
      value: 2,
      writable: true
    });
    o.value = 3333; // 3333

    set 和 get 方法

    对象取值会调用get方法, 取得的值为 get 函数里的返回值
    对象赋值会调用set方法, 但是若赋值是用 Object.defineProperty 则不会调用set方法

    例:
    var o = {}
    Object.defineProperty(o, 'b', {
      configurable: true,
      get: () => { console.log('get'); return 1},
      set: (para) => { console.log('set' + para); }
    });
    o.b; // 输出'get'; 值为1
    o.b = 2; // 输出'set2'; 值为2
    
    
    // 下面的赋值 不会调用 set 方法
    Object.defineProperty(o, 'b', {
      value: 22222
    }); // o.b = 22222
    
    
    // 注意下面的写法则会报错
    Object.defineProperty(obj, 'b', {
        value: 1,
      get: function() { return 1; }
    });
    
    Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute
    不能同时设置 存取器(get 和 set方法) 和 (value 或 writable) 属性, 就算 writable 属性设置为 true 也不行

    参考地址:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

  • 相关阅读:
    Luogu3119 [USACO15JAN]Grass Cownoisseur G
    BZOJ4361 isn
    洛谷1330 封锁阳光大学
    codechef AUG17 T2 Chef and Mover
    codechef AUG17 T1 Chef and Rainbow Array
    【bzoj3211】花神游历各国&&【bzoj3038】上帝造题的七分钟2
    noip 瑞士轮 ————归并排序解法
    记录string的妙用
    洛谷P1550 [USACO08OCT]打井Watering Hole
    汕头市队赛 SRM 09 C 撕书
  • 原文地址:https://www.cnblogs.com/zhengming2016/p/6703201.html
Copyright © 2011-2022 走看看