美文网首页
第六章 Object.defineProperty()

第六章 Object.defineProperty()

作者: A郑家庆 | 来源:发表于2018-06-12 19:03 被阅读0次
  • 定义属性Object.defineProperty()方法
  • 定义多个属性
  • 读取属性的特性
    Object.defineProperty()方法直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
    属性描述符:数据描述符和存取描述符
    数据描述符是一个具有值的属性,该值可能是可写的,也可能是不可写的。存取描述符是由getter-setter函数描述的属性。描述符必须是两者之一,不能同时是两者。
    数据描述符和存取描述符均具有以下可选键值:

configurable:是否可配置

当且仅当该属性的configurable为true时,该属性描述符才能够被改变,同时该属性也能通过delete删除该属性。如果是直接在对象上定义的属性,它们这个特性默认值为true,如果是用Object.defineProperty()这个方法定义的属性,那么这个特性默认值为false。例:

字面量定义的属性:
var person = {
    name: 'nike'
  }
  console.log(Object.getOwnPropertyDescriptor(person, 'name'))
打印出:
  configurable:true
  enumerable:true
  value:"biconle"
  writable:true

Object.defineProperty()定义的属性:
  var person = {}
  Object.defineProperty(person, 'name', {
    value: 'nike'
  })
  console.log(Object.getOwnPropertyDescriptor(person, 'name'))
打印出:
configurable:false
enumerable:false
value:"nike"
writable:false

通过以上两种定义属性的方式来看,configurable值是不同的,enumerable、writable值也是不同的。

注意:把configurable值设为false,如果对这个属性调用delete,在严格模式下会报错,而且一旦把属性定义为不可配置的,就不能再把它变回可配置的了,enumerable这个属性也就不可以更改,不然也会报错。但是writable这个属性是可以更改的,如果一开始writable为true,则value可更改,如果writable为false,则会报错,以上都是不可配置时的情况。

enumerable:是否可枚举

当且仅当该属性enumerable为true时,该属性才能够出现在对象的枚举属性中。如果直接在对象上定义的属性,它们这个特性默认值为true,如果是用Object.defineProperty()这个方法定义的属性,那么这个特性默认值为false,同上。
数据描述符同时具有以下可选键值

writable:是否可修改属性的值

当且仅当该属性writable为true时,value值才能够被修改。如果直接在对象上定义的属性,它们这个特性默认值为true,如果是用Object.defineProperty()这个方法定义的属性,那么这个特性默认值为false,同上。

value:属性值

读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。这个特性默认值为undefined。
存取描述符同时具有以下可选键值

get

在读取属性时调用的函数。默认值为undefined。

set

在写入属性时调用的函数。默认值为undefined。

描述符可同时具有的键值

描述符 configurable enumerable writable value get set
数据描述符 Yes Yes Yes Yes No No
存取描述符 Yes Yes No No Yes Yes

下面是存取描述符的例子:

var book = {
   _year = 2004,
   edition: 1
}
object.defineProperty(book, 'year', {
    get: function () {
       return this._year
   },
   set: function (newVlue) {
       if (newVlue > 2004) {
         this._year = newVlue
         this.edition += newVlue - 2004
     } 
   }
})
book.year = 2005
console.log(book.edition)   // 2

定义多个属性

如果为对象定义多个属性则用Object.defineProperties()方法,该方法接受两个对象参数:第一个是要添加或修改属性的对象,第二个是要添加的属性及描述。例:

var book = {}
object.defineProperties(book,  {
   _year: {
     writable: true,
     value: 2004
   },
  edition: {
     writable: true,
     value: 1
   },
   year: {
    get: function () {
       return this._year
   },
   set: function (newVlue) {
       if (newVlue > 2004) {
         this._year = newVlue
         this.edition += newVlue - 2004
     } 
   }
 }
})

读取属性的特性

Object.getOwnPropertyDescriptor()方法可以取得给定属性的描述符。这个方法接受两个参数:属性所在的对象和要读取其描述符的属性名称。返回值是一个对象,如果是数据描述符,这个对象的属性有configurable、enumerable、writable、value,如果是存取描述符,这个对象的属性有configurable、enumerable、get、set

相关文章

网友评论

      本文标题:第六章 Object.defineProperty()

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