面向对象的程序设计之对象

声明对象

1
2
3
4
5
6
7
// 字面量方式
var person1 = {
name: 'YY'
}
// 使用Object()
var person2 = new Object()
person2.name = 'JJ'

对象的属性

数据属性和访问器属性

  1. 数据属性的特性

    • [[Configurable]],默认为false
    • [[Enumerable]],默认为false
    • [[Writable]],默认为false
    • [[Value]],默认为undefined
    • 注:使用字面量或Object()声明的对象,[[Configurable]]/[[Enumerable]]/[[Writable]]的值默认为true,[[Value]]的值默认为undefined
  2. 访问器属性

    • 访问器属性不包含数据值,它包含一对getter和setter函数
    • 访问器属性有4个特性
      • [[Configurable]],默认为false
      • [[Enumerable]],默认为false
      • [[Get]],默认为false
      • [[Set]],默认为false
    • 访问器属性不能直接定义,必须通过defineProperty来定义
    • 读取是调用[[Get]],写入时调用[[Set]]

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      var person3 = {
      _age: 12, name: 'XX'
      }
      Object.defineProperty(person3, 'age', {
      get: function () {return this._age},
      set: function (age) {
      this._age = age
      this.name = 'BXX'
      }
      })
      console.log(person3.age) // 12
      person3.age = 13
    • 只定义[[Get]],属性是只读的;只定义[[Set]],属性能写入,但是不能被读取,非严格模式下返回undefined

其他属性操作

  1. 定义多个属性:Object.defineProperties()
  2. 读取属性的特性:Object.getOwnPropertyDescriptor(obj, propertyName)