对象管理器(defineProperty)进修笔记

对象管理器(defineProperty)

在 JavaScript 内里声明一个变量,一般我们有三种体式格局可以完成:

    let person = {} // 对象字面量
    let cat = new Object() // new 运算符
    let dog = Object.create(null) // create 函数

我们可以简朴的将 key 值和 value 值赋进去,但在 ES5 中 JavaScript 供应了一个对象管理器的要领给我们,让我们可以很邃密的对每个属性定制它们的行动,我们离别可以为属性设置:

  • 可设置特征(configurable)

  • 可罗列属性(enumerable)

  • 可以写特征(writable)

  • 值(value)

  • 设置 getter 要领(get)

  • 设置 setter 要领(set)

起首让我们看看怎样运用Object.defineProperty来定制属性吧:

  let person = {}

  Object.defineProperty(person, 'name', {
  configurable: true,
  enumerable: true,
  writeable: true,
  value: '_我已从中二毕业了'
  })

  Object.defineProperty(person, 'age', {
  configurable: true,
  enumerable: true,
  writeable: true,
  value: 18
  })

  console.log(person.name) // _我已从中二毕业了
  console.log(person.age) // 18

经由过程上面的代码可以看出 Object.defineProperty 这个函数可以接收三个参数:

  1. obj:须要定义属性的对象

  2. prop:需被定义或修正的属性名

  3. descriptor:需被定义或修正的属性的描述符

语法

Object.defineProperty(obj, prop, descriptor)

可设置特征(configurable)

当 configurable 这个属性为 true 的时刻示意这个属性可以从父对象中删除。当 configurable 设置为 false 的时刻就会锁定这个属性,没法被修正。经由过程设置 configurable 我们可以将一些属性锁定,来防备他人的修正,这是一种防备编程情势,就像言语的内置对象一样(不过 JavaScript 的内置对象都可以被随便变动)。

  let person = {}

  Object.defineProperty(person, 'name', {
  configurable: false,
  value: '_我已从中二毕业了'
  })

  Object.defineProperty(person, 'age', {
  configurable: true,
  value: 18
  })

  delete person.name
  console.log(person.name) // _我已从中二毕业了

  delete person.age
  console.log(person.age) // undefined

  person.name = 'John'
  console.log(person.name) // _我已从中二毕业了

  person.age = 19
  console.log(person.age) // 19

可罗列属性(enumerable)

一般来说我们会经由过程for in操纵来遍历可以罗列的属性。固然我们也可以设置属性为不可罗列,这些属性就不可以被罗列了,从而防备遍历查找到这个属性。可以运用 propertyIsEnumerable 来推断某一个属性是不是可以罗列。

  let person = {}

  Object.defineProperty(person, 'name', {
    enumerable: true,
    value: '_我已从中二毕业了'
  })

  Object.defineProperty(person, 'age', {
    enumerable: false,
    value: 18
  })
    
  // 只输出了 name    
  for (var key in person) {
    console.log(key)
  }

  console.log(Object.keys(person)) // ["name"]
  console.log(Object.getOwnPropertyNames(person)) // ["name", "age"]
  console.log(person.propertyIsEnumerable('name')) // true
  console.log(person.propertyIsEnumerable('age')) // false
  console.log(person.age) // 18

可以写特征(writable)

当 writable 为 true 的时刻,与属性相干联的值是可以变动的。不然,值就不能转变。

  let person = {}
  let person2 = person

  Object.defineProperty(person, 'name', {
    writable: false,
    value: '_我已从中二毕业了'
  })

  Object.defineProperty(person, 'age', {
    writable: true,
    value: 18
  })

  person.name = 'John'
  console.log(person.name) // _我已从中二毕业了
  console.log(person2.name) // _我已从中二毕业了

  person.age = 19
  console.log(person.age) // 19
  console.log(person.age) // 19

  person2.name = 'John'
  console.log(person.name) // _我已从中二毕业了
  console.log(person2.name) // _我已从中二毕业了

  person2.age = 20
  console.log(person.age) // 20
  console.log(person.age) // 20

相干链接

    原文作者:_我已经从中二毕业了
    原文地址: https://segmentfault.com/a/1190000005021014
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞