常见的 Object 方法

6 阅读3分钟

在 JavaScript 中,Object 是一个内置对象,它提供了一些静态方法和属性,用于操作和处理对象。以下是一些常见的 Object 方法:

1. 创建和复制对象

  • Object.create(proto, [propertiesObject])

    • 创建一个新对象,并指定其原型(proto)。
    • 可选的第二个参数可以定义对象的属性。
    const proto = { name: "Alice" };
    const obj = Object.create(proto);
    console.log(obj.name); // "Alice"(继承自原型)
    
  • Object.assign(target, ...sources)

    • 将多个源对象的属性复制到目标对象中(浅拷贝)。
    const obj1 = { a: 1 };
    const obj2 = { b: 2 };
    const result = Object.assign({}, obj1, obj2);
    console.log(result); // { a: 1, b: 2 }
    
  • Object.defineProperties(obj, props)

    • 在对象上定义多个属性,并可以设置它们的特性(如可枚举、可配置等)。
    const obj = {};
    Object.defineProperties(obj, {
      a: { value: 1, writable: true, enumerable: true },
      b: { value: 2, writable: false, enumerable: false }
    });
    console.log(obj); // { a: 1 }
    
  • Object.defineProperty(obj, prop, descriptor)

    • 定义或修改对象的单个属性。
    const obj = { a: 1 };
    Object.defineProperty(obj, "b", {
      value: 2,
      writable: false,
      enumerable: true,
      configurable: true
    });
    console.log(obj); // { a: 1, b: 2 }
    

2. 获取对象信息

  • Object.keys(obj)

    • 返回对象自身可枚举属性的键名数组。
    const obj = { a: 1, b: 2 };
    console.log(Object.keys(obj)); // ["a", "b"]
    
  • Object.values(obj)

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

    • 返回对象自身可枚举属性的键值对数组。
    const obj = { a: 1, b: 2 };
    console.log(Object.entries(obj)); // [["a", 1], ["b", 2]]
    
  • Object.getOwnPropertyNames(obj)

    • 返回对象自身所有属性的键名(包括不可枚举属性)。
    const obj = { a: 1 };
    Object.defineProperty(obj, "b", { value: 2, enumerable: false });
    console.log(Object.getOwnPropertyNames(obj)); // ["a", "b"]
    
  • Object.getOwnPropertyDescriptor(obj, prop)

    • 获取对象某个属性的描述符。
    const obj = { a: 1 };
    const descriptor = Object.getOwnPropertyDescriptor(obj, "a");
    console.log(descriptor); // { value: 1, writable: true, enumerable: true, configurable: true }
    

3. 检查对象

  • Object.hasOwnProperty(prop)

    • 检查对象自身是否拥有某个属性(不检查原型链)。
    const obj = { a: 1 };
    console.log(obj.hasOwnProperty("a")); // true
    console.log(obj.hasOwnProperty("toString")); // false
    
  • Object.is(value1, value2)

    • 比较两个值是否严格相等(与 === 类似,但更严格)。
    console.log(Object.is(0, -0)); // false
    console.log(0 === -0); // true
    
  • Object.isExtensible(obj)

    • 检查对象是否可扩展(是否可以添加新属性)。
    const obj = {};
    console.log(Object.isExtensible(obj)); // true
    Object.preventExtensions(obj);
    console.log(Object.isExtensible(obj)); // false
    
  • Object.isFrozen(obj)

    • 检查对象是否被冻结(不可修改属性值、不可添加或删除属性)。
    const obj = { a: 1 };
    Object.freeze(obj);
    console.log(Object.isFrozen(obj)); // true
    
  • Object.isSealed(obj)

    • 检查对象是否被密封(不可添加或删除属性,但可以修改属性值)。
    const obj = { a: 1 };
    Object.seal(obj);
    console.log(Object.isSealed(obj)); // true
    

4. 修改对象

  • Object.preventExtensions(obj)

    • 防止对象添加新属性。
    const obj = { a: 1 };
    Object.preventExtensions(obj);
    obj.b = 2;
    console.log(obj); // { a: 1 }
    
  • Object.freeze(obj)

    • 冻结对象,使其不可修改(不可添加、删除或修改属性)。
    const obj = { a: 1 };
    Object.freeze(obj);
    obj.a = 2;
    console.log(obj); // { a: 1 }
    
  • Object.seal(obj)

    • 密封对象,使其不可添加或删除属性,但可以修改属性值。
    const obj = { a: 1 };
    Object.seal(obj);
    obj.a = 2;
    console.log(obj); // { a: 2 }
    

5. 其他方法

  • Object.prototype.toString.call(value)

    • 获取值的类型(比 typeof 更精确)。
    console.log(Object.prototype.toString.call(123)); // "[object Number]"
    console.log(Object.prototype.toString.call([1, 2, 3])); // "[object Array]"
    
  • Object.getPrototypeOf(obj)

    • 获取对象的原型。
    const obj = {};
    console.log(Object.getPrototypeOf(obj)); // Object.prototype
    
  • Object.setPrototypeOf(obj, prototype)

    • 设置对象的原型。
    const proto = { name: "Alice" };
    const obj = {};
    Object.setPrototypeOf(obj, proto);
    console.log(obj.name); // "Alice"
    

总结

Object 提供了丰富的方法,用于创建、操作、检查和修改对象。这些方法在日常开发中非常有用,尤其是在处理复杂的对象结构时。掌握这些方法可以帮助你更高效地编写和调试 JavaScript 代码。