笔记-js高级程序设计-6.面向对象-理解对象

124 阅读2分钟

创建一个对象

// 两种方式
var o1 = new Object()  //利用Object内置对象
var o2 = {} //使用对象字面量的方式

为对象添加属性

数据属性

o1.name = 'phoeny'
o2 = {name: 'phoeny'}

上面两种方式创建的属性都是数据属性,它具有四个特性:

  1. configurable: true(是否可通过delete删除,是否可转换为访问器属性,其特性是否可修改)
  2. enumerable: true (是否可通过for-in循环)
  3. writable: true (是否可修改属性的值)
  4. value: undefined (属性的数据值)

也就是通过普通方式创建的数据属性都有其默认的特性,这些特性也是可以修改的,修改数据属性的特性用:Object.defineProperty()

var o = {}
o.defineProperty(o, 'name', {
  writable: false,
  value: 'yoyo'
})
// 上一步已经将对象o的name属性定义为不可修改的属性了,所以再尝试去修改它是无效的
o.name = 'jim'  // 仍然是 yoyo

使用Object.defineProperty()的注意点:

  1. configurable特性,这个特性一旦设置为false,就不能再设置回true了。
  2. 使用Object.defineProperty()时,如果不设置configurableenumerablewritable,它们会默认变为false

访问器属性

访问器属性,也具有四个特性:

  1. configurable: true(是否可通过delete删除,是否可转换为访问器属性,其特性是否可修改)
  2. enumerable: true (是否可通过for-in循环)
  3. get: undefined (读取属性时调用的函数)
  4. set: undefined (写入属性时调用的函数)

访问器属性不能直接定义,必须使用Object.defineProperty()来定义。

var o = {_year: 2004 }
Object.defineProperty(o, 'year', {
   get: function() {
      return this._year;
   },
   set: function(newValue) {
      var y = newValue > 2023 ? 2023 : newValue
      this._year = y
   },
})
o.year = 2022  // {_year: 2022}
o.year = 2024 // {_year: 2023}

使用访问器属性的注意点:

  1. 不设置get特性表示属性不能读,不设置set特性表示属性不能写

Object.defineProperty()

Object.defineProperty可以用于:

  1. 修改数据属性的特性
  2. 定义访问器属性

同时也提供Object.defineProperties()定义同时定义多个属性。提供Object.getOwnPropertyDescriptor()读取属性的特性。