Object 对象(构造函数)的方法

1,963 阅读9分钟

Object 构造函数的方法

Object.assign()

Object.assign();通过复制一个或多个对象来创建一个新的对象。

语法:Object.assign(target, ...sources)

  • 参数: target 目标对象。 sources 源对象
  • 返回值:目标对象。
  如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。
  后面的源对象的属性将类似地覆盖前面的源对象的属性。
  Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。
  该方法使用源对象的[[Get]]和目标对象的[[Set]],所以它会调用相关 getter 和 setter。
  因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。
  为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。
  - 注意,Object.assign 不会在那些source对象值为 null 或 undefined 的时候抛出错误。

Object.create()

Object.create();使用指定的原型对象和属性创建一个新对象。

语法:Object.create(proto[, propertiesObject])

  • 参数:proto 新创建对象的原型对象。 propertiesObject 可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。
  • 返回值:一个新对象,带着指定的原型对象和属性。
  注意:如果propertiesObject参数是 null 或非原始包装对象,则抛出一个 TypeError 异常

Object.defineProperty()

Object.defineProperty();给对象添加一个属性并指定该属性的配置。

语法:Object.defineProperty(obj, prop, descriptor)

  • 参数:obj 要在其上定义属性的对象。 prop 要定义或修改的属性的名称。 descriptor 将被定义或修改的属性描述符。
  • 返回值:被传递给函数的对象。
 该方法允许精确添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的,
  能够在属性枚举期间呈现出来(for...in 或 Object.keys 方法),这些属性的值可以被改变,也可以被删除。
  这个方法允许修改默认的额外选项(或配置)。
  默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改的。

Object.defineProperties()

Object.defineProperties();给对象添加多个属性并分别指定它们的配置。

语法:Object.defineProperties(obj, props)

  • 参数:obj 在其上定义或修改属性的对象。 props 要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种:数据描述符和访问器描述符(更多详情,请参阅Object.defineProperty())。
  • 返回值:传递给函数的对象。

Object.entries()

Object.entries();返回给定对象自身可枚举属性的 [key, value] 数组。

语法:Object.entries(obj)

  • 参数:obj 可以返回其可枚举属性的键值对的对象。
  • 返回值:给定对象自身可枚举属性的键值对数组。
  Object.entries()返回一个数组,其元素是与直接在object上找到的可枚举属性键值对相对应的数组。
  属性的顺序与通过手动循环对象的属性值所给出的顺序相同。

Object.freeze()

** Object.freeze();冻结对象:其他代码不能删除或更改任何属性。**

语法:Object.freeze(obj)

  • 参数:obj 要被冻结的对象。
  • 返回值:被冻结的对象。
  数据属性的值不可更改,访问器属性(有getter和setter)也同样(但由于是函数调用,给人的错觉是还是可以修改这个属性)。
  如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象。
  数组作为一种对象,被冻结,其元素不能被修改。没有数组元素可以被添加或移除。
  这个方法返回传递的对象,而不是创建一个被冻结的副本。

Object.getOwnPropertyDescriptor()

Object.getOwnPropertyDescriptor();返回对象指定的属性配置。

语法:Object.getOwnPropertyDescriptor(obj, prop)

  • 参数:obj 需要查找的目标对象 props 目标对象内属性名称
  • 返回值:如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。

Object.getOwnPropertyNames()

Object.getOwnPropertyNames();返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名。

语法:Object.getOwnPropertyNames(obj)

  • 参数:obj 一个对象,其自身的可枚举和不可枚举属性的名称被返回。
  • 返回值:在给定对象上找到的自身属性对应的字符串数组。

Object.getOwnPropertySymbols()

Object.getOwnPropertySymbols();返回一个数组,它包含了指定对象自身所有的符号属性。

语法:Object.getOwnPropertySymbols(obj)

  • 参数:obj 要返回 Symbol 属性的对象。
  • 返回值:在给定对象自身上找到的所有 Symbol 属性的数组。

Object.getPrototypeOf()

Object.getPrototypeOf();返回指定对象的原型对象。

语法:Object.getPrototypeOf(object)

  • 参数:obj 要返回其原型的对象。
  • 返回值:给定对象的原型。如果没有继承属性,则返回 null 。

Object.is()

Object.is();比较两个值是否相同。所有 NaN 值都相等(这与==和===不同)。

语法:Object.is(value1, value2);

  • 参数:value1 第一个需要比较的值。 value2 第二个需要比较的值。
  • 返回值:表示两个参数是否相同的布尔值 。
  这种相等性判断逻辑和传统的==运算不同,==运算符会对它两边的操作数做隐式类型转换(如果它们类型不同),
  然后才进行相等性比较,(所以才会有类似 "" == false 等于 true 的现象),但 Object.is 不会做这种类型转换。
  这与 === 运算符的判定方式也不一样。=== 运算符(和== 运算符)将数字值 -0 和 +0 视为相等,并认为 Number.NaN 不等于 NaN。

Object.isExtensible()

Object.isExtensible();判断对象是否可扩展。

语法:Object.isExtensible(obj)

  • 参数:obj 需要检测的对象
  • 返回值: 表示给定对象是否可扩展的一个Boolean 。
  默认情况下,对象是可扩展的:即可以为他们添加新的属性。以及它们的 __proto__ 属性可以被更改。
  Object.preventExtensions,Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展(non-extensible)。

Object.isFrozen()

Object.isFrozen();判断对象是否已经冻结。

语法:Object.freeze(obj)

  • 参数:obj 要被冻结的对象。
  • 返回值: 被冻结的对象。

Object.isSealed()

Object.isSealed();判断对象是否已经密封。

语法:Object.isSealed(obj)

  • 参数:obj要被检查的对象。
  • 返回值: 表示给定对象是否被密封的一个Boolean 。

Object.keys()

Object.keys();返回一个包含所有给定对象自身可枚举属性名称的数组。

语法:Object.keys(obj)

  • 参数:obj要返回其枚举自身属性的对象。
  • 返回值: 一个表示给定对象的所有可枚举属性的字符串数组。
  Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性。
  这些属性的顺序与手动遍历该对象属性时的一致。

Object.preventExtensions()

Object.preventExtensions()防止对象的任何扩展。

语法:Object.preventExtensions(obj)

  • 参数:obj将要变得不可扩展的对象。
  • 返回值: 已经不可扩展的对象。

Object.seal()

Object.seal();防止其他代码删除对象的属性。

语法:Object.seal(obj)

  • 参数:obj将要被密封的对象。
  • 返回值: 被密封的对象。

Object.setPrototypeOf()

Object.setPrototypeOf();设置对象的原型(即内部 [[Prototype]] 属性)。

语法:Object.setPrototypeOf(obj, prototype)

  • 参数:obj要设置其原型的对象。prototype 该对象的新原型(一个对象 或 null).

Object.values()

Object.values();返回给定对象自身可枚举值的数组。

语法:Object.values(obj)

  • 参数:obj被返回可枚举属性值的对象。
  • 返回值:一个包含对象自身的所有可枚举属性值的数组。
  Object.values()返回一个数组,其元素是在对象上找到的可枚举属性值。
  属性的顺序与通过手动循环对象的属性值所给出的顺序相同。

总结:

  • Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
  • Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
  • Object.defineProperties() 方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
  • Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
  • Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。
  • Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
  • Object.fromEntries() 方法把键值对列表转换为一个对象。
  • Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
  • Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
  • Object.getOwnPropertySymbols() 方法返回一个给定对象自身的所有 Symbol 属性的数组。
  • Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。
  • Object.is() 方法判断两个值是否是相同的值。
  • Object.isExtensible() 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。
  • Object.isFrozen()方法判断一个对象是否被冻结。
  • Object.isSealed() 方法判断一个对象是否被密封。
  • Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。
  • Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。
  • Object.prototype 属性表示 Object 的原型对象。
  • Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要可写就可以改变。
  • Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null。
  • Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。

后续再把具体代码案例加上来吧,今天好累,写的我脑壳疼!!!

参考文档:developer.mozilla.org/zh-CN/docs/…