@H_502_0@
参数:
(1)obj
必需。Object 对象分配到的变量
名称。
(2)值
可选。任一 JavaScript 基元数据类型(数字、布尔值或字符串)。 如果值是一个对象,则返回的对象是未
修改的。 如果值是 null、“未定义”或“未提供”,则创建无
内容的对象。
@H_
502_0@
Object对象的方法
@H_
502_0@Object作为构造
函数使用时,可以接受一个参数。如果该参数是一个对象,则直接返回这个对象;如果是一个原始类型的值,则返回该值对应的包装对象。利用这一点,可以写一个判断变量是否为对象的
函数。
@H_
502_0@要在Object对象上面部署一个
方法,有两种做法。
@H_
502_0@部署在Object对象本身
部署在Object.prototype对象
Object.keys
方法和Object.getOwnPropertyNames
方法很相似,一般用来遍历对象的
属性。它们的参数都是一个对象,都返回一个数组,该数组的成员都是对象自身的(而不是继承的)所有
属性名。两者区别在于,前者只返回可枚举的
属性,后者还返回不可枚举的
属性名。由于数组存在不可枚举
属性length,因此一般使用Object.keys遍历数组。
@H_
502_0@JavaScript没有提供计算对象
属性个数的
方法,可通过 Object.keys(o).length 和 Object.getOwnPropertyNames(o).length
获取。
@H_
502_0@Object.observe
方法用于观察对象
属性的变化。
@H_
502_0@原型链相关
方法:
@H_
502_0@Object.create():
生成一个新对象,并该对象的原型。
Object.getPrototypeOf():
获取对象的Prototype对象。
Object实例对象的方法
@H_
502_0@Object.prototype.valueOf():valueOf
方法的作用是返回一个对象的值,默认情况下返回对象本身。该
方法的主要用途是,JavaScript
自动类型转换时会默认
调用这个
方法。
@H_
502_0@Object.prototype.toString():toString
方法的作用是返回一个对象的字符串形式。当对象用于字符串加法时,会
自动调用toString
方法。
@H_
502_0@使用call
方法,可以在任意值上
调用Object.prototype.toString
方法,从而判断这个值的类型。不同数据类型的toString
方法返回值如下:
@H_
502_0@数值:返回[object Number]
字符串:返回[object String]
布尔值:返回[object Boolean]
undefined:返回[object Undefined]
null:返回[object Null]
对象:返回”[object “ + 构造
函数的
名称 + “]”
@H_
502_0@利用这个特性,可写出一个比typeof运算符更准确的类型判断
函数。
type({}); // "object"
type([]); // "array"
type(5); // "number"
@H_
502_0@在上面这个type
函数的基础上,还可以
加上专门判断某种类型数据的
方法。
type.isObject({}); // true
type.isNumber(NaN); // false
type.isElement(document.createElement('div')); // true
@H_
502_0@
对象的属性模型
@H_
502_0@在JavaScript内部,每个
属性都有一个对应的attributes对象,保存该
属性的一些元信息。使用Object.getOwnPropertyDescriptor
方法,可读取o对象的p
属性的attributes对象。attributes对象包含如下元信息:
@H_
502_0@value:表示该
属性的值,默认为undefined(只要writable和configurable有一个为true,就可以改动)。
writable:表示该
属性的值(value)是否可以改变,默认为true。
enumerable: 表示该
属性是否可枚举,默认为true,也就是该
属性会出现在for…in和Object.keys()等操作中。一般来说,系统原生的
属性(即非
用户自定义的
属性)都是不可枚举的。
表示“可配置性”,默认为true。如果设为false,表示无法
删除该
属性,也不得改变attributes对象(value
属性除外,如果writable为true,仍可改变value),也就是configurable
属性控制了attributes对象的可写性。
表示该
属性的取值
函数(getter),默认为undefined。
表示该
属性的存值
函数(setter),默认为undefined。
@H_
502_0@Object.defineProperty
方法允许通过定义attributes对象,来定义或
修改一个
属性,然后返回
修改后的对象。格式如下:
@H_
502_0@Object.defineProperty(object,propertyName,attributesObject)
Object.defineProperty
方法接受三个参数,第一个是
属性所在的对象,第二个是
属性名(它应该是一个字符串),第三个是
属性的描述对象。通过此
方法定义
属性,
属性对象的writable、configurable、enumerable三个
属性的默认值都为false。
@H_
502_0@如果一次性定义或
修改多个
属性,可以使用Object.defineProperties
方法。需要注意的是,一旦定义了取值
函数get(或存值
函数set),就不能将writable设为true,或者同时定义value
属性,否则会报错。
@H_
502_0@enumerable可以用来设置“秘密”
属性,如果一个
属性的enumerable为false,则 for..in 循环、Object.keys
方法和 JSON.stringify
方法都不会取到该
属性,但可以通过 o.xx 直接
获取它的值。
@H_
502_0@for…in循环和Object.keys
方法的区别在于,前者
包括对象继承自原型对象的
属性,而后者只
包括对象本身的
属性。如果需要
获取对象自身的所有
属性,不管enumerable的值,可以使用Object.getOwnPropertyNames
方法。
@H_
502_0@可配置性决定了一个变量是否可以被
删除(delete)。当使用var命令声明变量时,变量的configurable为false,而不使用var命令声明变量时(或者使用
属性赋值的方式声明变量),变量的可配置性为true。这说明,delete只能
删除对象的
属性。
@H_
502_0@除了直接定义以外,
属性还可以用存取
函数(accessor)定义。其中,存值
函数称为setter,使用set命令;取值
函数称为getter,使用get命令。利用存取
函数,可以实现数据对象与DOM对象的双向绑定。
@H_
502_0@
控制对象状态
@H_
502_0@JavaScript提供了三种
方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是preventExtensions,其次是seal,最强的freeze。
@H_
502_0@Object.preventExtensions
方法可以使得一个对象无法再
添加新的
属性,但可以用delete命令
删除它的现有
属性。Object.isExtensible
方法可以用来检查是否可以为一个对象
添加属性。
@H_
502_0@Object.seal
方法使得一个对象既无法
添加新
属性,也无法
删除旧
属性。Object.seal还把现有
属性的attributes对象的configurable
属性设为false,使得attributes对象不再能改变。Object.isSealed
方法用于检查一个对象是否使用了Object.seal
方法。
@H_
502_0@Object.freeze
方法可以使得一个对象无法
添加新
属性、无法
删除旧
属性、也无法改变
属性的值,使得这个对象实际上变成了常量。Object.isFrozen
方法用于检查一个对象是否使用了Object.freeze()
方法。
@H_
502_0@使用上面这些
方法锁定对象的可写性,但是依然可以通过改变该对象的原型对象,来为它
增加属性。
@H_
502_0@一种
解决方案是,把原型也冻结住。
@H_
502_0@
PS:
Object 对象包含在所有其他 JavaScript 对象中;它的所有
方法和
属性均可用于所有其他对象。
方法可在
用户定义的对象中进行重新定义,并由 JavaScript 在适当时间
调用。 toString
方法是频繁重新定义的 Object
方法的一个示例。
在此语言参考中,每个 Object
方法的说明均
包括内部 JavaScript 对象的默认和对象特定的实现信息。
IE兼容方面,微软MSDN文档的话是”已在 Internet Explorer 6 之前的 Internet Explorer 中引入 Object Object“,所以不用担心~