对象 P120
通过
对象直接量
,关键字new
,Object.create()
(ECMAScript 5)创建对象Object.create(null)
创建一个没有原型的对象;但它不会继承任何东西,包括toString()
等基础方法;也就是说,它不能和+
运算符一起工作
创建一个普通的空对象
1 | var o = Object.create(Object.prototype); |
1 | /** |
属性访问错误 P127
下列场景给对象o设置属性p失败
o中的熟悉p是只读的
o中的属性p是继承属性,并且它是只读的
o没有使用setter方法继承属性p;并且o的可扩展性是false
删除属性 P127
delete
运算符只能删除自有属性,不能删除继承属性
1 | var a = { |
由于已经删除的属性的引用依然存在,在某些不严谨的代码中可能造成内存泄漏
在销毁对象的时候,要遍历属性中的属性,依次删除
delete表达式删除成功或没有任何副作用(如删除不存在的属性)或delete后不是一个属性访问表达式,delete 返回true
1 | var o = {x: 1}; |
检测属性
检测: 属性名(字符串) in 对象;
如果对象的自有属性或者继承属性包含这个属性则返回true
hasOwnProperty()
检测是否是对象的自有属性propertyIsEnumerable()
检测自有属性并且是可枚举的
!== 判断一个属性是否为 undefined
1 | var o = { |
in
和 !==
和 !=
in 可以区分不存在的属性和存在但是值为undefined的属性
1 | var o = { |
!==
区分undefined
和null
1 | // x的值不是null或undefined |
枚举属性
got/in遍历可枚举属性(自有属性和继承属性)
ECMAScript 5
中:
Object.keys()
返回可枚举的自有属性的名称数组Object.getOwnPropertyNames()
返回所有自有属性的名称数组
getter
和 setter
定义存储器的属性使用一个或两个和属性同名的函数,使用
get
和set
关键字
函数体内的this
指向这个对象
存取器属性是可以继承的
1 | // 直角坐标系定义 |
属性的特性
数据属性的4个特性:
value
(它的值)writable
(可写性)enumerable
(可枚举性)configurable
(可配性)
存取器属性的4个特性:
get
(读取)set
(写入)enumerable
(可枚举性)configurable
(可配性)
Object.getOwnPropertyDescriptor()
获取某个对象特定的属性描述符
只能得到自有属性的描述符;对于继承属性和不存在的属性,返回undefined
1 | console.log(Object.getOwnPropertyDescriptor(p, 'r')); |
Object.defineProperty()
设置属性的特性或新建属性特性
只能修改自有属性,不能修改继承属性
返回修改后的对象
1 | var o = {}; |
Object.defineProperties()
同时修改多个属性
返回修改后的对象
1 | var p = Object.defineProperties({},{ |
Object.defineProperty()
Object.defineProperties()
抛出类型错误异常
- 如果对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新属性
- 如果属性是不可配置的, 则不能修改它的可配置性和可枚举性
- 如果存取器属性是不可配置的,则不能修改其
getter
和setter
方法,也不能将它转换为数据属性- 如果数据属性是不可配置的, 则不能将它转换为存取器属性
- 如果数据属性是不可配置的, 则不能将它的可写性从
false
设置为true
, 但是可以从true
修改为false
- 如果数据属性是不可配置的且不可写的, 则不能修改它的值;
- 如果数据属性是可配置的但不可写,属性的值是可以修改的(标记为可写->修改它的值->转换为不可写)
复制属性的特性
1 | /** |
对象的三个属性
原型属性
我们经常把
o的原型属性
直接叫做o的原型
通过new
创建的对象使用构造函数的prototype
属性作为它们的原型
通过Object.reate()
创建的对象使用第一个参数作为它们的原型Object.getPrototypeOf()
查询原型p.isPrototypeOf(o)
检测 p 是否是 o 的原型
类属性
表示对象的类型信息([object class])
1 | function classof(o) { |
可扩展性
Object.isExtensible()
判断是否可扩展Object.preventExtensions()
将对象转换为不可扩展 无法再转换为可扩展Object.seal()
将对象设置为不可扩展,将所有自有属性都设置为不可配置;即不能给这个对象添加新属性,而且它已有的属性也不能删除或配置,不过它已有的可写属性依然可以设置Object.isSealed()
检测是否已经封闭(sealed)Object.freeze()
冻结对象, 将对象设置为不可扩展, 将其属性设置为不可配置, 将它自有的所有数据属性设置为只读(如果对象的存取器属性具有setter方法,存取器属性将不受影响,仍可以通过给属性赋值调用)Object.isFrozen()
检测对象是否冻结
序列化对象
ECMAScript 5 提供
JSON.stringify()
和JSON.parse()
NaN
Infinity
-Infinity
序列化的结果是null
日期对象序列化的结果是ISO格式的日期字符串
函数 RegExp Error对象 和 undefined值不能序列化和还原JSON.stringify()
只能序列化对象的可没据的自有属性
不能序列化的在序列化的输出字符串中会将这个属性省略掉
文章若有纰漏请大家补充指正,谢谢~~