Bootstrap

(04)JavaScript 中 Object的属性详解

以下是 JavaScript 中 Object 类型的主要方法、属性和示例。内容分为 静态方法(通过 Object 构造函数调用)和 实例方法/属性(通过对象实例调用):


一、静态方法(Object.xxx)

  1. Object.assign(target, ...sources)
    合并源对象的可枚举属性到目标对象。

    const obj1 = { a: 1 };
    const obj2 = { b: 2 };
    const merged = Object.assign({}, obj1, obj2); // { a:1, b:2 }
    
  2. Object.create(proto)
    创建一个新对象,使用现有对象作为新对象的原型。

    const parent = { x: 10 };
    const child = Object.create(parent);
    console.log(child.x); // 10 (继承自parent)
    
  3. Object.defineProperty(obj, prop, descriptor)
    定义或修改对象的属性特性(如 writable, enumerable, configurable)。

    const obj = {};
    Object.defineProperty(obj, 'x', { value: 42, writable: false });
    obj.x = 100; // 静默失败(严格模式下报错)
    
  4. Object.entries(obj)
    返回对象自身可枚举属性的键值对数组。

    const obj = { a: 1, b: 2 };
    console.log(Object.entries(obj)); // [ ['a',1], ['b',2] ]
    
  5. Object.freeze(obj)
    冻结对象,禁止修改属性、添加或删除属性。

    const obj = { x: 42 };
    Object.freeze(obj);
    obj.x = 100; // 静默失败(严格模式下报错)
    
  6. Object.keys(obj)
    返回对象自身可枚举属性的键名数组。

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

    const obj = { a: 1, b: 2 };
    console.log(Object.values(obj)); // [1, 2]
    
  8. Object.fromEntries(iterable)
    将键值对列表(如 Map 或数组)转换为对象。

    const entries = [ ['a', 1], ['b', 2] ];
    const obj = Object.fromEntries(entries); // { a:1, b:2 }
    
  9. Object.is(value1, value2)
    严格比较两个值,处理 NaN+0/-0 的特殊情况。

    console.log(Object.is(NaN, NaN)); // true
    console.log(Object.is(+0, -0));   // false
    

二、实例方法/属性(obj.xxx)

  1. obj.hasOwnProperty(prop)
    检查属性是否为对象自身的(非继承的)。

    const obj = { a: 1 };
    console.log(obj.hasOwnProperty('a')); // true
    console.log(obj.hasOwnProperty('toString')); // false(继承自原型)
    
  2. obj.toString()
    返回对象的字符串表示。通常被覆盖以实现自定义输出。

    const obj = { a: 1 };
    console.log(obj.toString()); // "[object Object]"
    
  3. obj.valueOf()
    返回对象的原始值。默认返回对象本身。

    const numObj = new Number(42);
    console.log(numObj.valueOf()); // 42(原始值)
    
  4. obj.constructor
    指向创建该实例的构造函数。

    const arr = [];
    console.log(arr.constructor === Array); // true
    
  5. obj.isPrototypeOf(target)
    检查对象是否在另一个对象的原型链上。

    function Parent() {}
    const child = new Parent();
    console.log(Parent.prototype.isPrototypeOf(child)); // true
    
  6. obj.propertyIsEnumerable(prop)
    检查属性是否可枚举。

    const obj = { a: 1 };
    console.log(obj.propertyIsEnumerable('a')); // true
    
  7. obj.__proto__(非标准,但广泛支持)**
    访问或设置对象的原型(推荐使用 Object.getPrototypeOf()Object.setPrototypeOf())。

    const obj = {};
    obj.__proto__ = Array.prototype;
    console.log(obj instanceof Array); // true
    

三、其他重要概念

  • in 操作符:检查属性是否在对象或其原型链中。

    console.log('toString' in {}); // true(继承自Object.prototype)
    
  • delete 操作符:删除对象的属性。

    const obj = { a: 1 };
    delete obj.a;
    console.log(obj.a); // undefined
    

总结

以上是 JavaScript 中对象的核心方法和属性。实际开发中,需注意区分 自身属性原型链上的属性,以及方法的 可枚举性可配置性 等特性。对于更高级的元编程,可进一步学习 ProxyReflect 对象。

;