描述对象/属性特性/属性描述符
JavaScript 中的对象是一个无序属性的集合,每个属性都包含一个键和一个值。这些属性可以是数据属性或访问器属性。描述对象用于描述一个特定属性的特性,这些特性如下:
- value: 属性的值
- writable: 是否可修改属性的value
- set: 写入属性时调用的函数(使用Brynn.name = 'Boolean'就会调用set函数),该方法可
- get:获取属性时调用的函数(使用console.log(Brynn.name)就会调用get函数)
- configurable:是否可修改属性的特性(不包括value)或者可删除
- enumerable: 是否可枚举
这些特性有默认值,
- 通过字面量定义的:
writable、configurable、enumerable都是true - 通过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,undefined和null直接报错- 数组会被视为对象
- 如果复制的是访问器属性(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,undefined和null直接报错- 只能获取指定对象自身的属性的属性描述符,而不能获取原型链上的属性的属性描述符。
Object.getOwnPropertyDescriptors(obj)
return 目标对象所有属性的描述对象
它用于获取一个对象上所有自身属性的属性描述符
obj如果不是对象类型,都会被转成对象类型并返回引用地址,并且不改变obj,undefined和null直接报错- 只能获取指定对象自身的属性的属性描述符,而不能获取原型链上的属性的属性描述符。
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
判断一个对象是否被冻结,本质是对象是否可扩展以及是否所有属性的两个特性configurable和writable是否为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为
undefined和null会报错
Object.values(obj)
return array
获取到对象所有本身的可枚举的非Symbol属性的键值,并以数组形式返回
- obj为
undefined和null会报错
Object.entries(obj)
return array
获取到对象所有本身的可枚举的非Symbol属性的键值对,并以二维数组形式返回
- obj为
undefined和null会报错
Object.getOwnPropertyNames(obj)
return array
获取到对象所有本身的非Symbol属性的键名,并以数组形式返回
- obj为
undefined和null会报错
Object.getOwnPropertySymbols(obj)
return array
获取到对象所有本身的Symbol属性的键名,并以数组形式返回
- obj为
undefined和null会报错
Reflect.ownKeys()
return array
获取到对象所有本身的属性的键名,并以数组形式返回
- obj为
undefined和null会报错