一方面JavaScript原生提供Object对象。
另一方面JavaScript 的所有其他对象都继承自Object对象,即那些对象都是Object的实例。
本文介绍Object原生对象本身的方法和Object构造函数的实例的方法。
Object对象本身
作为一个普通函数
Object对象本身实际上是一个函数,作为一个普通函数,通过传入不同的参数返回一个对象
var obj;
obj = Object(); //空对象
obj = Object(undefined); //空对象
obj = Object(null); //空对象
obj=Object(123); //Number {123}
obj=Object('123'); //String {"123"}
obj=Object(true); //Boolean {true}
obj=Object([1,2,3]); //[1, 2, 3]
obj=Object({a:1}); //{a: 1}
- 如果参数为undefined、null或不传参返回一个空对象
- 如果参数是原始类型的值,Object方法将其转为对应的包装对象的实例
- 如果参数是一个对象,返回该对象
Object作为构造函数,可以在前面使用new操作符,生成新对象
通过var obj = new Object()的写法生成新对象,与字面量的写法var obj = {}是等价的。
var obj = new Object();
和作为普通函数一样可以接受一个参数,如果该参数是一个对象,则直接返回这个对象;如果是一个原始类型的值,则返回该值对应的包装对象。
但是,Object()与new Object()两者的语义是不同的,前者表示把参数value转成一个对象,后者表示生成一个对象。
Object 的静态方法
所谓“静态方法”指部署在Object对象自身的方法,通过在控制台打印Object的自身属性,可以看到Object对象的23个不可枚举属性,静态方法就被包含在这些属性中。
一、对象属性模型的相关方法
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| Object.keys() | 一个对象 | 数组 | 返回对象可枚举的自有属性 |
| Object.getOwnPropertyNames() | 对象 | 数组 | 返回对象全部的自有属性 |
| Object.getOwnPropertyDescriptor() | ①对象 ②属性名 | 对象 | 返回对象某属性的描述 |
| Object.defineProperty() | ①对象②属性名③属性描述(对象) | 对象 | 添加/修改对象指定属性的特性 |
| Object.defineProperties() | ①对象 | 对象 | 添加/修改对象一个或多个指定属性的特性 |
通过下面的代码来验证一下这些方法:
var obj = {};
Object.defineProperties(obj,{
a: {
value: 1,
configurable: true, //不可修改该属性的特性
writable: true, //该属性的值可以修改
enumerable: true //可枚举
},
b: {
value: 2 //其他特性是默认值,即:不可修改属性的特性,不能修改属性值,不可枚举
}
})
二、控制对象状态的方法
Object.preventExtensions():防止对象扩展。
Object.isExtensible():判断对象是否可扩展。
Object.seal():禁止对象配置。
Object.isSealed():判断一个对象是否可配置。
Object.freeze():冻结一个对象。
Object.isFrozen():判断一个对象是否被冻结。
三、原型链相关方法
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
| Object.create() | 对象 | 新对象 | 返回一个新对象,并使用现有的对象来提供新创建的对象的__proto__ |
| Object.getPrototypeOf() | 对象 | 对象 | 获取对象的Prototype对象。 |
Object 的实例方法
除了静态方法,还有不少方法定义在Object的原型对象上。称它们为实例方法,所有Object的实例对象都继承了这些方法。
constructor
创建对象的构造函数
valueOf()返回当前对象对应的值
valueOf方法的作用是返回一个对象的“值”,默认情况下返回对象本身。
PS:valueOf方法的主要用途是,JavaScript 自动类型转换时会默认调用这个方法。
toString()返回当前对象对应的字符串形式,可以用来判断一个值的类型
var obj= new Object();
obj.toString() // "[object Object]"
上例中调用空对象的toString方法,结果返回一个字符串object Object,第二个Object表示该值的构造函数,这个例子中,obj.toString()返回"[object Object]",我们希望一个数组的实例可以返回"[object Array]",以此类推,来判断对象的类型,行不行呢?
通过上面的图片可以看出,并没有得到我们要的答案,这是因为数组、字符串、函数、Date 、RegExp、Function 对象都分别部署了自定义的toString方法,以字符串对象为例,其原型链上有两个toString方法
调用字符串的toString方法实际上是调用了String构造函数中的toString方法,返回字符串a。
为了得到类型字符串,如上例中要得到"[object String]",可以使用Object.prototype.toString方法。通过函数的call方法,帮助我们判断这个值的类型。
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('a') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Math) // "[object Math]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(new RegExp()) //"[object RegExp]"
Object.prototype.toString.call(JSON) //"[object JSON]"
toLocaleString() 返回当前对象对应的本地字符串形式
Object.prototype.toLocaleString方法与toString的返回结果相同,也是返回一个值的字符串形式。
PS:数组、字符Number、Date 对象都分别部署了自定义的toLocaleString方法,覆盖了Object.prototype.toLocaleString方法。
其中日期的实例对象的toString和toLocaleString返回值不一样,toLocaleString的返回值跟用户设定的所在地域相关。
hasOwnProperty() 判断某个属性是否为当前对象自有属性
var obj = {a: 1};
obj.hasOwnProperty('a'); //true
obj.hasOwnProperty('b'); //false