##6.4检测属性
- in运算符
- hasOwnProperty()检测是否是对象自有属性
- propertyIsEnumerable()是hasProperty()的增强版,只有检测到是自有属性且这个属性的enumerable为true时才返回true。
- !==判断属性是否undefined(in可以区分不存在的属性和存在但是值为undefined的属性)
1 | var o = { x: undefined } // Property is explicitly set to undefined |
##6.7属性特性
1 | Object.getOwnPropertyDescriptor({x:1}, "x"); //获得某个对象特定属性的属性描述符 |
- 如果对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新属性。
- 如果属性是不可配置的,则不能修改它的可配置性和可枚举性。
- 如果存取器属性是不可配置的,则不能修改其gette了和setter方法,也不能将它转换为数据属性。
- 如果数据属性是不可配置的,则不能将它转换为存取器属性。
- 如果数据属性是不可配置的,则不能将它的可写性从fa15e修改为true,但可以从true修改为false。
- 如果数据属性是不可配置且不可写的,则不能修改它的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可写的)。
1 | /** |
##6.8对象的属性
- 原型
- 类
- 可扩展性
###6.8.1原型
isPrototypeOf()检测一个对象是否是另一个对象的原型。
1 | var p = {x:1}; // Define a prototype object. |
###6.8.2类属性
1 | function classof(o) { |
###6.8.3可扩展性Object.isExtensible()
判断对象是否可扩展。Object.preventExtensions()
将对象转换为不可扩展(把对象转换成不可扩展后,就不能再转回可扩展了)。Object.seal()
除了能把对象设置为不可扩展,还可以将对象所有自有属性都设置为不可配置Object.isSealed()
检查对象是不是封闭Object.freeze()
对象设置为不可扩展,还可以将对象所有自有属性都设置为不可配置外,还将它自有的所有数据属性都设置为只读(有setter
方法的存取器不受影响)Object.isFrozen()
检测对象是否冻结
##6.9对象序列化JSON.stringify()
序列化JSON.parse()
反序列化
##6.10对象方法
toString()
返回一个表示调用这个方法的对象值的字符串。(很多类都带有自定义的toString()
方法)toLocalString()
返回一个表示这个对象的本地化字符串。toJSON()
Object.prototype中实际上没有定义这个方法,但对于需要执行序列号的对象来说,JSON.stringify()
方法会调用toJSON()
。具体参见Date.toJSON()
。valueOf()
方法,当js需要将对象转换成某种原始值(尤其是转换成数字)而不是字符串时使用。