在JavaScript中,Object 是一个全局对象,它有很多有用的静态方法可以用来处理对象。以下是一些常用的 Object 函数:

1. 创建

assign()

  • 用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它返回目标对象。
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target); // { a: 1, b: 4, c: 5 }

create()

  • 创建一个新对象,使用现有的对象来提供新创建的对象的原型。
const person = {
  isHuman: false,
  printIntroduction: function() {
    console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
  }
};
const me = Object.create(person);
me.name = 'Matthew'; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten
me.printIntroduction();
// Expected output: "My name is Matthew. Am I human? true"

2. 遍历

entries()

  • 返回一个包含对象自身可枚举属性键值对数组的数组。
const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]

keys()

  • 返回一个包含对象自身可枚举属性名称的数组。
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.keys(obj)); // ['a', 'b', 'c']

values()

  • 返回一个包含对象自身可枚举属性值的数组。
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.values(obj)); // [1, 2, 3]

3. 属性相关

defineProperty()

  • 直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
const obj = {};
Object.defineProperty(obj, 'property1', {
  value: 42,
  writable: false
});
console.log(obj.property1); // 42
obj.property1 = 77; // No error thrown, but the assignment is ignored.
console.log(obj.property1); // 42

defineProperties()

  • 直接在一个对象上定义多个新属性或修改现有属性。
const obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
  // etc. etc.
});

hasOwnProperty()

  • hasOwnProperty 方法用于检查一个对象是否拥有某个自有属性,即不是继承自原型链的属性。

Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。在支持 Object.hasOwn 的浏览器中,建议使用 Object.hasOwn(),而非 hasOwnProperty()。

const obj = { a: 1, b: 2 };
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('c')); // false

4.特殊处理

freeze()

  • 冻结一个对象,其他代码不能删除或更改任何属性。
const obj = {
  prop: 42
};
Object.freeze(obj);
obj.prop = 33;
// Throws an error in strict mode
console.log(obj.prop);
// Expected output: 42

seal()

  • 封闭一个对象,阻止添加新属性并将现有属性标记为不可配置。当前属性的值只要可写就可以改变。
const obj = {
  prop: 42
};
Object.seal(obj);
obj.prop = 33;
console.log(obj.prop);
// Expected output: 33
delete obj.prop; // Cannot delete when sealed
console.log(obj.prop);
// Expected output: 33

preventExtensions()

  • 阻止一个对象添加新属性。
const obj = {
  a: 1
};
Object.preventExtensions(obj);
obj.b = 2;
console.log(obj.b);
// Expected output: undefined

这些方法提供了强大的工具来处理和操作JavaScript中的对象。它们在处理对象时非常有用,无论是创建新对象、修改现有对象,还是检查对象的属性。

is()

  • 判断两个值是否为同一个值。
console.log(Object.is(25, 25)); // true
console.log(Object.is('foo', 'foo')); // true
console.log(Object.is(null, null)); // true
console.log(Object.is(undefined, undefined)); // true
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is(-0, +0)); // false

fromEntries()

  • 把键值对列表转换为一个对象。
const entries = new Map([
  ['foo', 'bar'],
  ['baz', 42]
]);
const obj = Object.fromEntries(entries);
console.log(obj);
// { foo: "bar", baz: 42 }

这些方法提供了对对象属性的精细控制,以及对象原型链的管理。在使用这些方法时,了解它们的具体行为和可能的性能影响是很重要的。