zoukankan      html  css  js  c++  java
  • 你不知道的JS系列 ( 34 ) - 对象属性描述符

    从 ES5 开始,所有的属性都具备了属性描述符
    var myObject = {
      a: 2
    }
    Object.getOwnPropertyDescriptor(myObject, 'a')
    // {value: 2, writable: true, enumerable: true, configurable: true}

    这个普通的对象属性对应的属性描述符可不仅仅只是一个 2。它还包含另外三个特性,writable(不可写)、enumerable(可枚举)、configurable(可配置)。在创建普通属性时属性描述符会使用默认值。我们可以使用 Object.defineProperty(...) 来添加一个新属性或者修改一个已有属性

    var myObject = {};
    Object.defineProperty(myObject, 'a', {
      value: 2,
      writable: true,
      configurable: true,
      enumerable: true
    })

    我们使用 defineProperty(...)添加了一个普通的属性,然而,一般来说不会使用这种方式添加,除非你想修改属性描述符

    writable
    writable决定是否可以修改属性的值
    var myObject = {};
    Object.defineProperty(myObject, 'a', {
      value: 2,
      writable: false, // 不可写
      configurable: true,
      enumerable: true
    })
    myObject.a = 3;
    myObject.a; // 2

    我们对于属性值的修改失败了,如果在严格模式下,会出错,TypeError



    configurable
    只要属性是可配置的,就可以使用 defineProperty(...) 方法来修改属性描述符
    var myObject = {
      a: 2
    }
    myObject.a = 3;
    myObject.a; // 3
    
    
    Object.defineProperty(myObject, 'a', {
      value: 4,
      writable: true,
      configurable: false, // 不可配置
      enumerable: true
    })
    
    
    myObject.a; // 4
    myObject.a = 5;
    myObject.a; // 5
    
    
    Object.defineProperty(myObject, 'a', {
      value: 6,
      writable: true,
      configurable: true, // 不可配置
      enumerable: true
    }) // TypeError

    不管是不是处于严格模式,修改一个不可配置的属性描述符都会出错,把 configurable 修改成 false 是单向操作,无法撤销

    *:即便属性是 configurable:false,还是可以把 writable 改成 false,但是无法由 false 改成 true,这是个例外。
    configuable:fase 还会禁止删除这个属性
    var myObject = {};
    Object.defineProperty(myObject, 'a', {
      value: 4,
      writable: true,
      configurable: false, // 不可配置
      enumerable: true
    })
    delete myObject.a;
    myObject.a; // 2

    如你所见,delete 语句失败了,因为属性是不可配置的

    enumerable
    这个描述符控制的是属性是否出现在对象的属性枚举中,比如 for...in 循环,如果把 enumerable 设置成 false,这个属性就不会出现在枚举中
  • 相关阅读:
    java 变量的初始化顺序
    Asp.net MVC3.0 入门指南 1.简介
    使用EnterpriseLibrary5实现数据的缓存(附完整代码下载)
    js showModalDialog 取得(访问)父窗体的语法
    Asp.net MVC3.0 入门指南 2.控制器Controller
    linq 之入门(一) O/R设计器的使用
    sql2000 示例数据库Northwind的 ER图、字段说明及使用Powerdesigner反向工程方法
    局域网共享文件win7系统
    远程桌面 不能粘贴文本 的解决办法
    解决vs2005控件事件为空白
  • 原文地址:https://www.cnblogs.com/wzndkj/p/12549944.html
Copyright © 2011-2022 走看看