Object 是 JavaScript 的一种 数据类型 。它用于存储各种键值集合和更复杂的实体。Objects 可以通过 Object() 构造函数或者使用 对象字面量 的方式创建。在 JavaScript 中,几乎所有的对象都是 Object 类型的实例,它们都会从 Object.prototype 继承属性和方法,虽然大部分属性都会被覆盖(shadowed)或者说被重写了(overridden)。

Object 的属性&方法

属性

  • Object.prototype.constructor: 返回对象的构造函数(用于创建实例对象)。
  • Object.prototype.__proto__: 访问器属性,暴露了通过它访问的对象的内部 [[Prototype]] ,。非标准属性,不推荐使用。使用 Object.getPrototypeOf()Object.setPrototypeOf() 来替代。

原型方法(实例方法)

  • Object.prototype.isPrototypeOf(obj): 测试一个对象是否存在于另一个对象的原型链上。
  • Object.prototype.propertyIsEnumerable(prop): 判断对象的属性是否可枚举。与 Object.getOwnPropertyDescriptor(obj, prop).enumerable 相同。

  • Object.prototype.toLocaleString(): 返回一个该对象的特定语言环境的字符串表示。

  • Object.prototype.toString(): 返回一个表示该对象的字符串。
  • Object.prototype.valueOf(): 将 this 值转换为一个对象并返回。此方法旨在用于自定义类型转换的逻辑时,重写派生类对象。

静态方法

属性与属性操作符

  • Object.defineProperties(obj, props): 在一个对象上定义多个新的属性或修改现有属性,并返回该对象。
  • Object.defineProperty(obj, prop, descriptor): 在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回该对象。
  • Object.getOwnPropertyDescriptor(obj, prop): 返回指定对象上一个自有属性对应的属性描述符。
  • Object.getOwnPropertyDescriptors(obj): 返回一个对象的所有自有属性的属性描述符。
  • Object.getOwnPropertyNames(obj): 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括 Symbol 值作为名称的属性)组成的数组。
  • Object.getOwnPropertySymbols(obj): 返回一个给定对象自身的所有 Symbol 属性的数组。

原型

  • Object.getPrototypeOf(): 返回指定对象的原型(内部 [[Prototype]] 属性的值)。
  • Object.setPrototypeOf(): 设置一个指定对象的原型。

遍历

  • Object.entries(obj): 返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环还会枚举原型链中的属性)。
  • Object.keys(obj): 返回一个给定对象自身所有可枚举属性组成的数组,数组中属性的顺序与使用 for...in 循环的顺序一致。
  • Object.values(obj): 返回一个给定对象自身所有可枚举值的数组,数组中值的顺序与使用 for...in 循环的顺序相同(区别在于 for-in 循环枚举原型链中的属性)。
  • Object.fromEntries(iterable): 把键值对列表(例如Array 、 Map 或者其它实现了可迭代协议的可迭代对象)转换为一个对象,返回该对象。Object.fromEntries(iterable)Object.entries(obj) 互逆。

操作对象

  • Object.create(proto[, propertiesObject]): 创建一个新对象,使用现有的对象来作为新创建对象的原型。在实践中,以 null 为原型的对象通常用于作为数据类型 map 的替代。
  • Object.freeze(obj): 冻结一个对象,使一个对象不能被修改,返回该对象。不能被修改包括不能添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性和值。冻结后该对象的原型也不能被修改。
  • Object.seal(obj): 封闭一个对象,对象不能添加新属性并将所有现有属性标记为不可配置的。
  • Object.preventExtensions(obj): 让一个对象变的不可扩展,也就是不能再添加新的属性。
  • Object.assign(target, ...sources): 将所有可枚举(Object.prototype.propertyIsEnumerable() 返回 true)的自有(Object.prototype.hasOwnProperty() 返回 true)属性从一个或多个源对象复制到目标对象,返回修改后的对象。

判断

  • Object.hasOwn(obj, prop): 用来判断一个属性是否是对象的自有属性。同 Object.prototype.hasOwnProperty() 类似。
  • Object.is(value1, value2): 判断两个值是否相同。几乎与 === 相同,差别是它们对待有符号的零和 NaN 不同,Object.is() 将数字 -0 和 +0 视为不同的,而将 Number.NaNNaN 视为相同的。
  • Object.isExtensible(obj): 判断一个对象是否是可扩展的,也即是否可以在它上面添加新的属性。
  • Object.isFrozen(obj): 判断一个对象是否被冻结,也即是否完全不能被修改。
  • Object.isSealed(obj): 判断一个对象是否被封闭,也即对象不能添加新属性并且所有现有属性都是不可配置的。

Object.prototype.isPrototypeOf()instanceof 运算符的区别

isPrototypeOf()instanceof 运算符不同。在表达式 object instanceof AFunction 中,object 的原型链是针对 AFunction.prototype 进行检查的,而不是针对 AFunction 本身。

1
2
3
4
var x = function(){};
var y = new x();
y instanceof x; // true
(x.prototype).isPrototypeOf(y); // true

Function.prototype.prototypeObject.prototype.__proto__ 的区别

  1. prototype 是函数实例的属性,__proto__ 是对象实例的属性。
  2. prototype 是标准的属性,__proto__ 是非标准的属性但现代浏览器一般已实现。
  3. obj.__proto__ === obj.constructor.prototype__proto__ 为构造函数的原型