Javascript中的对象-Object
2016-03-09
Javascript中Object是所有对象的祖宗,所有对象都继承自它,而它本身也是一个构造函数,可以直接生成或包装对象
Object对象的方法
当Object 被作为工具方法,而不是构造方法时,
- Object(arg):包装方法,将非对象类型包装成一个对象
- Object.create(proto[, propertiesObject]):
- Object.getPrototypeOf(obj):
Object实例对象的方法
必须区分“构造函数的方法”和“实例对象的方法”。
- valueOf():返回当前对象对应的值。
- toString():返回当前对象对应的字符串形式。
这个方法很有用,可以用于判断对象类型 - toLocalString():返回当前对象对应的本地字符串形式。
- hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。
- isPrototypeOf():判断当前对象是否为另一个对象的原型。
- propertyIsEnumerable():判断某个属性是否可枚举。
对象的属性模型
- Object.getOwnPropertyDescriptor():获取对象的属性的精确描述模型
Object.defineProperty()
Object.defineProperties()
这两个方法有性能损耗,会拖慢执行速度,不宜大量使用。
可枚举性(enumerable)
如果一个属性的enumerable为false,下面三个操作不会取到该属性。
for..in循环
Object.keys方法
JSON.stringify方法(有时可以利用这一点,为对象添加注释信息。)
因此,enumerable可以用来设置“秘密”属性。
遍历对象属性方法
Object.keys()
Object.getOwnPropertyNames()
一般情况下,几乎总是使用Object.keys方法,遍历数组的属性。
存取器
1 | var o ={ |
利用存取器,可以实现数据对象与DOM对象的双向绑定。
对象拷贝
对于简单属性,就直接拷贝,对于那些通过描述对象设置的属性,则使用Object.defineProperty方法拷贝。
1 | var extend = function (to, from) { |
控制对象状态
JavaScript提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是preventExtensions,其次是seal,最强的freeze。
不可扩展对象(不能加,可改,可删)
Object.preventExtensions方法可以使得一个对象无法再添加新的属性。可以用delete命令删除它的现有属性。
判断: Object.isExtensible(obj);
密封的对象(不能加,删,可改)
Object.seal方法使得一个对象既无法添加新属性,也无法删除旧属性。
判断: Object.isSealed(obj);
冻结的对象(不能加,不能改,不能删)
Object.freeze方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量。
判断: Object.isFrozen(obj);
局限性: 需要注意的是,使用上面这些方法锁定对象的可写性,但是依然可以通过改变该对象的原型对象,来为它增加属性。