属性的描述对象:JS的一个内部数据结构用来描述对象的属性。

  • 属性描述对象的六个元属性

    • value: 属性的属性值,默认为undefined
    • writable: 属性是否可写,布尔值,默认为true
    • enumerable: 属性是否可遍历,布尔值,默认为true
      • for in、Object.keys()、JSON.stringify()均不会遍历到enumerable为false的属性
    • configurable: 属性的可配置性,布尔值,默认为true
    • get: 属性的取值函数,默认为undefined
    • set: 属性的存值函数,默认为undefined
  • 几个主要的API和概念

    • Object.defineProperty(object, propertyName, attributesObject)
      • object:属性所在对象,被返回的对象
      • propertyName:属性名
      • attributesObject:属性描述对象
        定义一个p属性
        get、set属性不能同时和value属相共存,否则报错,并且设置了get、set属性后,writable、configurable、enumerable这三个属性的默认值都为false。
        var obj = Object.defineProperty({}, 'p', {
        value: 123,
        writable: false,
        enumerable: true,
        configurable: false
        });
        obj.p // 123
        obj.p = 246;
        obj.p // 123
    • Object.getOwnPropertyNames(obj)
      • 该属性会将对象自身所有属性以数组形式返回。
    • 存取器accessor
      • 取值函数getter,使用get属性,不接收参数
      • 存值函数setter,使用set属性,只接收一个属性值的参数
    • Object.freeze()
      • 将一个对象冻结,无法添加和删除属性,属性值也不可以改变,相当于一个常量。

包装对象(wrapper):分别将三个原始值number、string、boolean包装成对象的三个原生对象,也是三个构造函数,作用是使得原始数据类型也可以有调用自身的方法

var v1 = new Number(123);
typeof v1 // "object"
v1 === 123 // false
Number('123') // 123
  • 原始类型和示例对象的自动转换
    'abc'.length // 3
    为什么字符串可以使用length属性?看下面步骤,JS引擎自动包装对象:
    var str = 'abc';
    str.length // 3
    // 等同于
    var strObj = new String(str)
    // String {
    //   0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"
    // }
    strObj.length // 3
  • 自定义方法,定义到对象原型上。