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.NaN
与NaN
视为相同的。Object.isExtensible(obj)
: 判断一个对象是否是可扩展的,也即是否可以在它上面添加新的属性。Object.isFrozen(obj)
: 判断一个对象是否被冻结,也即是否完全不能被修改。Object.isSealed(obj)
: 判断一个对象是否被封闭,也即对象不能添加新属性并且所有现有属性都是不可配置的。
Object.prototype.isPrototypeOf()
与 instanceof
运算符的区别
isPrototypeOf()
与 instanceof
运算符不同。在表达式 object instanceof AFunction
中,object 的原型链是针对 AFunction.prototype
进行检查的,而不是针对 AFunction
本身。
1 | var x = function(){}; |
Function.prototype.prototype
与 Object.prototype.__proto__
的区别
prototype
是函数实例的属性,__proto__
是对象实例的属性。prototype
是标准的属性,__proto__
是非标准的属性但现代浏览器一般已实现。obj.__proto__ === obj.constructor.prototype
,__proto__
为构造函数的原型