属性的描述对象: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()
- 将一个对象冻结,无法添加和删除属性,属性值也不可以改变,相当于一个常量。
- Object.defineProperty(object, propertyName, attributesObject)
包装对象(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
- 自定义方法,定义到对象原型上。