对象方法

166 阅读7分钟

描述对象/属性特性/属性描述符

JavaScript 中的对象是一个无序属性的集合,每个属性都包含一个键和一个值。这些属性可以是数据属性或访问器属性。描述对象用于描述一个特定属性的特性,这些特性如下:

  • value: 属性的值
  • writable: 是否可修改属性的value
  • set: 写入属性时调用的函数(使用Brynn.name = 'Boolean'就会调用set函数),该方法可
  • get:获取属性时调用的函数(使用console.log(Brynn.name)就会调用get函数)
  • configurable:是否可修改属性的特性(不包括value)或者可删除
  • enumerable: 是否可枚举

这些特性有默认值,

  1. 通过字面量定义的:writable、configurable、enumerable都是true
  2. 通过defineProperty配置的writable、configurable、enumerable都是false

这些特性不能同时全部存在于一个属性上,根据这一点,属性又分为数据属性访问器属性

  • 数据属性:有value/writable/enumerable/configurable四个特性
  • 访问器属性: 是一种对象属性,它由 getter 函数和/或 setter 函数组成。与数据属性不同,访问器属性不包含一个固定的值,而是通过 getter 和 setter 函数来计算属性的值。访问器属性是通过在属性描述对象中设置 get 和/或 set 函数来定义 getter 和 setter的。有set/get/enumerable/configurable四个特性

关键词

get

在 JavaScript 中,get 是一个关键字,ES6中引入,用于定义访问器属性的 getter 方法。而 getter 则是指这个方法本身,它是一个特殊的函数,用于获取对象属性的值。 例如,以下代码定义了一个具有 getter 方法的对象属性:

const obj = {
  get myProp() {
    return 'Hello World!';
  }
};

console.log(obj.myProp); // 调用 getter 方法

在上面的代码中,当我们使用 obj.myProp 访问该属性时,实际上调用的是 myProp 的 getter 方法。因此,get 和 getter 的关系是,get 是用于定义 getter 方法的关键字,而 getter 则是指实际的获取属性值的方法本身。

set

set 是一个关键字,用于定义对象属性的 setter 方法,而 setter 则是指这个方法本身,它是一个特殊的函数,用于设置对象属性的值。 例如,以下代码定义了一个具有 setter 方法的对象属性:

const obj = {
  set myProp(value) {
    console.log(`Setting myProp to ${value}`);
  }
};

obj.myProp = 'Hello World!'; // 调用 setter 方法

在上面的代码中,当我们使用 obj.myProp = 'Hello World!' 设置该属性时,实际上调用的是 myProp 的 setter 方法。因此,set 和 setter 的关系是,set 是用于定义 setter 方法的关键字,而 setter 则是指实际的设置属性值的方法本身。

对象方法

Object.assign(targetObj, ?...sourceObjN)

return 目标对象的引用地址
用于将一个或多个对象的属性复制到目标对象中

  • 同名属性会被覆盖
  • 只能复制对象自身可枚举属性
  • 浅拷贝
  • targetObj如果不是对象类型,都会被转成对象类型并返回引用地址,并且不改变targetObj,undefinednull直接报错
  • 数组会被视为对象
  • 如果复制的是访问器属性(get xxx() {})将会先求值后在赋值给属性

Object.create(obj, ?{ ...keyN: propertyObject })

return Object
用于创建一个新的对象,并将其原型设置为指定对象obj或 null

  • 除了对象和null,其余都会报错,如果是null的话,新创建的对象将不会继承任何属性和方法
  • 第二个参数是一个包含属性以及属性描述对象的对象,会为新对象添加对应属性
  • 属性描述对象内的属性默认都是false,字面量创建对象时默认都是true

Object.defineProperty(obj, key, propertyObject)

return 目标对象的引用地址
修改或者添加目标对象的属性,第三个参数为属性的描述对象

  • 如果设置configurable为true,而writable为false,每次defineProperty还可以修改value,因为value也是特性之一
  • 如果设置configurable为false,就没有办法修改属性描述符了

Object.defineProperties(obj, { ...keyN: propertyObject })

return 目标对象的引用地址
修改或者添加目标对象的多个属性,除了添加多个其他与上面相同

Object.getOwnPropertyDescriptor(obj, ?key)

return 目标对象属性的描述对象
它用于获取一个对象上指定属性的属性描述符,如果没有找到将会返回 undefined

  • obj如果不是对象类型,都会被转成对象类型并返回引用地址,并且不改变obj,undefinednull直接报错
  • 只能获取指定对象自身的属性的属性描述符,而不能获取原型链上的属性的属性描述符。

Object.getOwnPropertyDescriptors(obj)

return 目标对象所有属性的描述对象
它用于获取一个对象上所有自身属性的属性描述符

  • obj如果不是对象类型,都会被转成对象类型并返回引用地址,并且不改变obj,undefinednull直接报错
  • 只能获取指定对象自身的属性的属性描述符,而不能获取原型链上的属性的属性描述符。

obj.hasOwnProperty(?key)

return boolean
它用于判断一个属性是否为对象自身的属性

Object.hasOwn(obj, key)

return boolean
它用于判断一个属性是否为对象自身的属性,

  • hasOwnProperty的区别的就是对于原型为null时使用不会报错,而hasOwnProperty会

obj.propertyIsEnumerable(key = undefined)

return boolean
用于检查给定的属性是否可枚举

Object.getPrototypeOf(obj)

return 目标对象的原型对象引用地址
它用于获取一个对象的原型

Object.setPrototypeOf(obj, prototypeObj)

return 目标对象的引用地址
它用于改变一个对象的原型

prototypeObj.isPrototypeOf(?obj2)

return boolean
它用于判断一个对象是否为另一个对象的原型

Object.freeze(arg = undefined)

return 目标arg,类型跟随arg
用于冻结一个对象,使其无法添加属性,所有的属性的特性configurable和writable会变成false

  • 属性中有嵌套对象,修改嵌套对象是允许的

Object.seal(arg = undefined)

return 目标arg,类型跟随arg
用于封闭一个对象,使其无法添加属性,所有的属性的特性configurable会变成false

Object.preventExtensions(arg = undefined)

return 目标arg,类型跟随arg
用于禁止扩展一个对象,使其无法添加属性

Object.isFrozen()

return boolean
判断一个对象是否被冻结,本质是对象是否可扩展以及是否所有属性的两个特性configurablewritable是否为false

Object.isSealed()

return boolean
判断一个对象是否被封闭,本质是对象是否可扩展以及是否所有属性的特性configurable和是否为false

Object.isExtensible()

return boolean
判断一个对象是否可扩展

Object.is(one = undefined, two = undefined)

return boolean
是JavaScript中用于比较两个值是否相等的方法。它与全等运算符(===)类似,但有一些特殊的行为。

  • NaN与NaN相等
  • +0和-0不相等

Object.fromEntries(iterable)

return object
它可以将键值对列表转换为一个对象,是Object.entries()的逆操作,该方法接受一个可迭代的对象(比如数组,Map)作为参数,该对象的每个元素都应该是一个表示键值对的数组,其中第一个元素是键,第二个元素是值。

obj.toString()

return string
将对象转换为字符串表示形式,一般情况下返回的都是[object Object]

Object.toLocaleString()

return string
将对象转换为本地化后的字符串表示形式,该方法的具体实现方式和输出结果可能因不同语言环境、区域设置或浏览器而异。

obj.valueOf()

return obj本身
用于返回对象的原始值。当调用该方法时,会返回对象的原始值。

遍历

for...in

for...in可以遍历对象的所有可枚举属性,包括对象本身的和对象继承来的属性

Object.keys(obj)

return array
获取到对象所有本身的可枚举的非Symbol属性的键名,并以数组形式返回

  • obj为 undefinednull 会报错

Object.values(obj)

return array
获取到对象所有本身的可枚举的非Symbol属性的键值,并以数组形式返回

  • obj为 undefinednull 会报错

Object.entries(obj)

return array
获取到对象所有本身的可枚举的非Symbol属性的键值对,并以二维数组形式返回

  • obj为 undefinednull 会报错

Object.getOwnPropertyNames(obj)

return array
获取到对象所有本身的非Symbol属性的键名,并以数组形式返回

  • obj为 undefinednull 会报错

Object.getOwnPropertySymbols(obj)

return array
获取到对象所有本身的Symbol属性的键名,并以数组形式返回

  • obj为 undefinednull 会报错

Reflect.ownKeys()

return array
获取到对象所有本身的属性的键名,并以数组形式返回

  • obj为 undefinednull 会报错