最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JavaScript中的Object.defineProperty()

    正文概述 掘金(him8)   2021-03-21   407

    今天和大家分享下,我们常常听到,但平时项目开发中却很少用的Object.defineProperty()

    题目

    先上两道开胃题:

    1. if (a=== 1 && a===2 && a===3 ) {}, if可能执行?
    2. 不用const,有什么办法使定义的变量不可变?

    Object.defineProperty

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

    语法
    参数

    下面要着重讲一下descriptor属性描述对象,该描述对象共有value、configurable、enumerable、value、writable、get、set等6个属性值,

    1. Value 属性
    • 示例
    var o = {};
    Object.defineProperty(o, "a",{
        value: 1
    });
    console.log(o.a)  // 1
    

    1. Writable 属性
    • 示例
    var o = {};
    Object.defineProperty(o, "a",{
        value: 1
        writable: false
    });
    console.log(o.a);  // 1
    o.a = 2;  // 抛出异常
    console.log(o.a);  // 1
    

    上面的问题2,const问题解决。


    1. Enumerable 属性
    • 示例
    var o = {};
    Object.defineProperty(o, "a", { value : 1, enumerable: true });
    Object.defineProperty(o, "b", { value : 2, enumerable: false });
    Object.defineProperty(o, "c", { value : 3 }); // enumerable 默认为 false
    o.d = 4; // 如果使用直接赋值的方式创建对象的属性,则 enumerable 为 true
    Object.defineProperty(o, Symbol.for('e'), {
      value: 5,
      enumerable: true
    });
    Object.defineProperty(o, Symbol.for('f'), {
      value: 6,
      enumerable: false
    });
    
    for (var i in o) {
      console.log(i);
    }
    // logs 'a' and 'd' (in undefined order)
    
    Object.keys(o); // ['a', 'd']
    Object.getOwnPropertyNames(o);   // ["a", "b", "c", "d"]
    Object.getOwnPropertySymbols(o);  // [Symbol(e), Symbol(f)]
    Reflect.ownKeys(o);  // ["a", "b", "c", "d", Symbol(e), Symbol(f)]
    
    o.propertyIsEnumerable('a'); // true
    o.propertyIsEnumerable('b'); // false
    o.propertyIsEnumerable('c'); // false
    o.propertyIsEnumerable('d'); // true
    o.propertyIsEnumerable(Symbol.for('e')); // true
    o.propertyIsEnumerable(Symbol.for('f')); // false
    
    var p = { ...o }
    p.a // 1
    p.b // undefined
    p.c // undefined
    p.d // 4
    p[Symbol.for('e')] // 5
    p[Symbol.for('f')] // undefined
    

    上面可以看到,getOwnPropertyNames是可以遍历出所有的非Symbol属性值,无论enumerable是否为false


    1. Configurable 属性
    • 示例
    var o = {};
    Object.defineProperty(o, "a",{
        value: 1,
        configurable: false
    });
    Object.defineProperty(o, 'a', {
      value: 12
    });   // 报错
    
    console.log(o.a)  // 1
    o.a = 2;  // // 无效
    delete o.a;  // 无效
    console.log(o.a)  // 1
    

    • 所以普通定义时:
    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
    });
    

    1. Get属性
    • 示例
    var o = { a: 1 };
    Object.defineProperty(o, "a", {
      get: function(){
          console.log("getter");
          return 2
      }
    });
    console.log(o.a);  // getter,  2
    

    1. Set属性
    • 示例
    var o = { a: 1 };
    Object.defineProperty(o, "a", {
      set: function(newValue){
          console.log("setter",newValue);
      }
    });
    o.a = 2;  // "setter"  2
    

    问题:1

    var b = 1;  // 避免重复取值定义b
    Object.defineProperty(window, "a", {
        get: function(){
            return b++
        }
    })
    if (a=== 1 && a===2 && a===3 ) {console.log("good")}
    

    问题:2

    var o = {};
    Object.defineProperty(o, "a",{
        value: 1
        writable: false
    });
    console.log(o.a);  // 1
    o.a = 2;  // 抛出异常
    console.log(o.a);  // 1
    

    Vue2.0中也是通过Object.defineProperty(),在get中进行依赖搜集(Watcher),set中更新订阅派发,具体流程感兴趣可以点这。


    起源地下载网 » JavaScript中的Object.defineProperty()

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元