前端JS: 对象API

5 阅读4分钟

JavaScript 对象方法是操作对象的重要工具。以下是主要对象方法,分为静态方法(Object构造函数上的方法)和实例方法(Object.prototype上的方法)。

一、 静态方法(Object构造函数的方法)

创建和定义对象

  • Object.create(proto, [propertiesObject]) : 使用指定的原型对象和属性创建一个新对象。

    const proto = { greet: function() { return "Hello" } };
    const obj = Object.create(proto, {
      name: { value: "John", writable: true }
    });
    console.log(obj.greet()); // 输出: Hello
    
  • Object.assign(target, ...sources) : 将所有可枚举的自有属性从一个或多个源对象复制到目标对象,返回目标对象。

    const target = { a: 1 };
    const source = { b: 2, c: 3 };
    Object.assign(target, source);
    console.log(target); // 输出: { a: 1, b: 2, c: 3 }
    
  • Object.defineProperty(obj, prop, descriptor) : 在对象上定义新属性或修改现有属性,并返回该对象。

    const obj = {};
    Object.defineProperty(obj, 'readOnlyProp', {
      value: 42,
      writable: false
    });
    console.log(obj.readOnlyProp); // 输出: 42
    obj.readOnlyProp = 100; // 静默失败(严格模式会报错)
    
  • Object.defineProperties(obj, props) : 在对象上定义多个属性。

    const obj = {};
    Object.defineProperties(obj, {
      prop1: { value: 'value1', writable: true },
      prop2: { value: 'value2', writable: false }
    });
    

获取对象信息

  • Object.keys(obj) : 返回对象自身可枚举属性名的数组。

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

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

    console.log(Object.entries(obj)); // 输出: [['a', 1], ['b', 2]]
    
  • Object.fromEntries(iterable) : 将键值对列表转换为对象(Object.entries的逆操作)。

    const entries = [['a', 1], ['b', 2]];
    console.log(Object.fromEntries(entries)); // 输出: { a: 1, b: 2 }
    
  • Object.getOwnPropertyNames(obj) : 返回对象所有自身属性(包括不可枚举,不包括Symbol)的数组。

    const obj = {};
    Object.defineProperty(obj, 'hidden', { value: 1, enumerable: false });
    console.log(Object.getOwnPropertyNames(obj)); // 输出: ['hidden']
    console.log(Object.keys(obj)); // 输出: []
    
  • Object.getOwnPropertySymbols(obj) : 返回对象自身所有Symbol属性的数组。

    const sym = Symbol('id');
    const obj = { [sym]: 123, name: 'test' };
    console.log(Object.getOwnPropertySymbols(obj)); // 输出: [Symbol(id)]
    
  • Object.getOwnPropertyDescriptor(obj, prop) : 返回指定属性的描述符对象。

    const desc = Object.getOwnPropertyDescriptor({a: 1}, 'a');
    console.log(desc);
    // 输出: {value: 1, writable: true, enumerable: true, configurable: true}
    
  • Object.getOwnPropertyDescriptors(obj) : 返回对象所有自身属性的描述符。

    const descs = Object.getOwnPropertyDescriptors({a: 1, b: 2});
    console.log(descs.a.value); // 输出: 1
    

原型相关

  • Object.getPrototypeOf(obj) : 返回指定对象的原型。

    const proto = { x: 10 };
    const obj = Object.create(proto);
    console.log(Object.getPrototypeOf(obj) === proto); // 输出: true
    
  • Object.setPrototypeOf(obj, prototype) : 设置对象的原型。

    const obj = {};
    const newProto = { x: 20 };
    Object.setPrototypeOf(obj, newProto);
    console.log(obj.x); // 输出: 20
    

对象状态控制

  • Object.freeze(obj) : 冻结对象,不可添加/删除/修改属性,也不可修改属性描述符。

    const obj = { prop: 42 };
    Object.freeze(obj);
    obj.prop = 33; // 静默失败(严格模式报错)
    console.log(obj.prop); // 输出: 42
    
  • Object.seal(obj) : 密封对象,不可添加/删除属性,但可修改现有属性值。

    const obj = { prop: 42 };
    Object.seal(obj);
    delete obj.prop; // 静默失败
    obj.prop = 100; // 允许修改
    console.log(obj.prop); // 输出: 100
    
  • Object.preventExtensions(obj) : 阻止对象添加新属性,但可删除和修改现有属性。

    const obj = { prop: 42 };
    Object.preventExtensions(obj);
    obj.newProp = 100; // 静默失败
    delete obj.prop; // 允许删除
    console.log(obj); // 输出: {}
    

状态检查

  • Object.is(value1, value2) : 判断两个值是否相同(类似===,但解决了NaN和±0的问题)。

    console.log(Object.is(NaN, NaN)); // 输出: true
    console.log(Object.is(+0, -0)); // 输出: false
    console.log(NaN === NaN); // 输出: false
    
  • Object.isExtensible(obj) : 判断对象是否可扩展。

    const obj = {};
    console.log(Object.isExtensible(obj)); // 输出: true
    Object.preventExtensions(obj);
    console.log(Object.isExtensible(obj)); // 输出: false
    
  • Object.isSealed(obj) : 判断对象是否被密封。

    const obj = {};
    console.log(Object.isSealed(obj)); // 输出: false
    Object.seal(obj);
    console.log(Object.isSealed(obj)); // 输出: true
    
  • Object.isFrozen(obj) : 判断对象是否被冻结。

    const obj = {};
    console.log(Object.isFrozen(obj)); // 输出: false
    Object.freeze(obj);
    console.log(Object.isFrozen(obj)); // 输出: true
    

二、 实例方法(Object.prototype上的方法)

  • hasOwnProperty(prop) : 判断对象自身(非继承)是否具有指定属性。

    const obj = { a: 1 };
    console.log(obj.hasOwnProperty('a')); // 输出: true
    console.log(obj.hasOwnProperty('toString')); // 输出: false(继承的)
    
  • isPrototypeOf(object) : 判断对象是否在另一个对象的原型链上。

    const proto = { x: 10 };
    const obj = Object.create(proto);
    console.log(proto.isPrototypeOf(obj)); // 输出: true
    
  • propertyIsEnumerable(prop) : 判断指定属性是否可枚举。

    const obj = { a: 1 };
    Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
    console.log(obj.propertyIsEnumerable('a')); // 输出: true
    console.log(obj.propertyIsEnumerable('b')); // 输出: false
    
  • toString() : 返回对象的字符串表示。

    const obj = { a: 1 };
    console.log(obj.toString()); // 输出: [object Object]
    console.log(Object.prototype.toString.call([])); // 输出: [object Array]
    
  • toLocaleString() : 返回对象的本地化字符串表示。

    const date = new Date();
    console.log(date.toLocaleString('zh-CN'));
    // 输出类似: 2026/3/6 10:00:00
    
  • valueOf() : 返回对象的原始值。

    const obj = { value: 10 };
    obj.valueOf = function() { return this.value; };
    console.log(obj + 5); // 输出: 15(隐式调用valueOf)
    

三、 已废弃的方法(不推荐使用)

  • __proto__ : 访问器属性,用于获取/设置对象的原型(已标准化但建议使用Object.getPrototypeOf()Object.setPrototypeOf())。

    const obj = {};
    const proto = { x: 1 };
    obj.__proto__ = proto; // 不推荐
    console.log(obj.__proto__ === proto); // 输出: true
    
  • __defineGetter__()/ __defineSetter__() : 定义getter/setter(已废弃,使用Object.defineProperty()代替)。

    const obj = {};
    obj.__defineGetter__('value', () => 42); // 不推荐
    console.log(obj.value); // 输出: 42
    

四、 属性描述符的配置项

当使用Object.defineProperty()等方法时,描述符对象可包含以下属性:

{
  value: 42,              // 属性值
  writable: true,         // 是否可修改
  enumerable: true,       // 是否可枚举(出现在for...in中)
  configurable: true,     // 是否可删除或修改描述符
  
  // 或使用存取描述符
  get: function() { return this._value; },
  set: function(newValue) { this._value = newValue; }
}

核心特性提醒:对象方法分为改变原对象和不改变原对象两类。Object.freeze(), Object.seal(), Object.preventExtensions()会改变对象状态,而Object.assign()会修改目标对象。其他大部分方法不改变原对象。