美文网首页
Object.defineProperty()

Object.defineProperty()

作者: 小棋子js | 来源:发表于2019-12-10 18:06 被阅读0次

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
    Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
    默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改的。

    const object1 = {};
    
    Object.defineProperty(object1, 'property1', {
      value: 42,
      writable: false
    });
    
    object1.property1 = 77;//在严格模式下引发错误
    console.log(object1.property1);// 结果: 42;如果writable: true;则输出77
    
    demo01 - 属性描述符默认值
    属性           默认值             说明
    configurable    false             描述属性是否可以被删除,默认为 false
    enumerable    false           描述属性是否可以被for...in或Object.keys枚举,默认为 false
    writable          false             描述属性是否可以修改,默认为 false
    get           undefined       当访问属性时触发该方法,默认为undefined
    set           undefined       当属性被修改时触发该方法,默认为undefined
    value           undefined         属性值,默认为undefined
    
    // demo01-default.html
    
    // Object.defineProperty(对象,属性,属性描述符)
      var obj = {};
      console.log('obj:', obj);
      // 默认不可删除,不可枚举,不可修改
      Object.defineProperty(obj, 'name', {
        value: 'Jameswain'
      });
      console.log('obj默认值:', obj);
      delete obj.name;
      console.log('obj删除后:', obj);
      console.log('obj枚举:', Object.keys(obj));
      obj.name = '詹姆斯,韦恩';
      console.log('obj修改后:', obj);
      // 不能重新定义,会报重复定义错误: Uncaught TypeError: Cannot redefine property: name
      Object.defineProperty(obj, 'name', {
        value: '詹姆斯,韦恩'
      });
    obj: {}
    结果:
    VM61:7 obj默认值: {name: "Jameswain"}
    VM61:9 obj删除后: {name: "Jameswain"}
    VM61:10 obj枚举: []
    VM61:12 obj修改后: {name: "Jameswain"}
    VM61:14 Uncaught TypeError: Cannot redefine property: name
        at Function.defineProperty (<anonymous>)
        at <anonymous>:14:10
    

    从运行结果可以发现,使用Object.defineProperty()定义的属性,默认是不可以被修改,不可以被枚举,不可以被删除的。可以与常规的方式定义属性对比一下:如果不使用Object.defineProperty()定义的属性,默认是可以修改、枚举、删除的:

     const obj = {};
     obj.name = 'Jameswain';
     console.log('枚举:', Object.keys(obj));
     obj.name = '詹姆斯-韦恩';
     console.log('修改:', obj);
     delete obj.name;
     console.log('删除:', obj);
    结果:
    枚举: ["name"]
    修改: {name: "詹姆斯-韦恩"}
    删除: {}
    

    相关文章

      网友评论

          本文标题:Object.defineProperty()

          本文链接:https://www.haomeiwen.com/subject/hrwggctx.html