一方面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个不可枚举属性,静态方法就被包含在这些属性中。
JavaScript原生对象-Object对象

一、对象属性模型的相关方法
方法 参数 返回值 说明
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   //其他特性是默认值,即:不可修改属性的特性,不能修改属性值,不可枚举
    }
  })

JavaScript原生对象-Object对象

二、控制对象状态的方法

Object.preventExtensions():防止对象扩展。
Object.isExtensible():判断对象是否可扩展。
Object.seal():禁止对象配置。
Object.isSealed():判断一个对象是否可配置。
Object.freeze():冻结一个对象。
Object.isFrozen():判断一个对象是否被冻结。

三、原型链相关方法
方法 参数 返回值 说明
Object.create() 对象 新对象 返回一个新对象,并使用现有的对象来提供新创建的对象的__proto__
Object.getPrototypeOf() 对象 对象 获取对象的Prototype对象。

JavaScript原生对象-Object对象

Object 的实例方法

除了静态方法,还有不少方法定义在Object的原型对象上。称它们为实例方法,所有Object的实例对象都继承了这些方法。
JavaScript原生对象-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]",以此类推,来判断对象的类型,行不行呢?

JavaScript原生对象-Object对象
通过上面的图片可以看出,并没有得到我们要的答案,这是因为数组、字符串、函数、Date 、RegExp、Function 对象都分别部署了自定义的toString方法,以字符串对象为例,其原型链上有两个toString方法
JavaScript原生对象-Object对象
调用字符串的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的返回值跟用户设定的所在地域相关。
JavaScript原生对象-Object对象

hasOwnProperty() 判断某个属性是否为当前对象自有属性

var obj = {a: 1};
obj.hasOwnProperty('a');  //true
obj.hasOwnProperty('b');  //false

相关文章: