对象中的常用几种方法

101 阅读3分钟

在 JavaScript 中,Object 对象和 Symbol 类型都提供了一些方法。下面是 Object 和 Symbol 对象的常用方法列表,并且指出每个方法是否可以通过原型链查找,以及提供使用方法:

Object 对象的方法:

  1. Object.assign(target, ...sources):可以原型链查找。用于将一个或多个源对象的属性复制到目标对象 target 中。

    • 示例:
      const target = {};
      const source = { name: 'John', age: 30 };
      
      Object.assign(target, source);
      
      console.log(target);   // { name: 'John', age: 30 }
      
  2. Object.create(proto, [propertiesObject]):不可以原型链查找。通过指定的原型对象 proto 创建一个新对象。

    • 示例:
      const personProto = { 
        greeting() {
          console.log('Hello!');
        }
      };
      
      const john = Object.create(personProto);
      
      john.greeting();   // Hello!
      
  3. Object.defineProperties(obj, props):不可以原型链查找。定义或修改对象的多个属性。

    • 示例:
      const obj = {};
      
      Object.defineProperties(obj, {
        name: { value: 'John', writable: true },
        age: { value: 30, writable: false }
      });
      
      console.log(obj.name);   // John
      console.log(obj.age);    // 30
      
  4. Object.defineProperty(obj, prop, descriptor):不可以原型链查找。定义或修改对象的指定属性。

    • 示例:
      const obj = {};
      
      Object.defineProperty(obj, 'name', {
        value: 'John',
        writable: true
      });
      
      console.log(obj.name);   // John
      
  5. Object.entries(obj):可以原型链查找。返回一个给定对象的可枚举属性键值对的数组。

    • 示例:
      const obj = { name: 'John', age: 30 };
      const entries = Object.entries(obj);
      
      console.log(entries);   // [ ['name', 'John'], ['age', 30] ]
      
  6. Object.freeze(obj):不可以原型链查找。冻结对象,防止修改现有属性或添加新属性。

    • 示例:
      const obj = { name: 'John', age: 30 };
      Object.freeze(obj);
      
      obj.name = 'Jane';      // 修改被禁止
      obj.gender = 'Male';    // 添加被禁止
      
      console.log(obj);   // { name: 'John', age: 30 }
      
  7. Object.getOwnPropertyDescriptors(obj):不可以原型链查找。返回指定对象所有属性的属性描述符。

    • 示例:
      const obj = { name: 'John', age: 30 };
      const descriptors = Object.getOwnPropertyDescriptors(obj);
      
      console.log(descriptors.name);   // { value: 'John', writable: true, enumerable: true, configurable: true }
      
  8. Object.getOwnPropertyNames(obj):不可以原型链查找。返回一个数组,包含对象的所有自有属性,包括不可枚举属性。

    • 示例:
      const obj = { name: 'John', age: 30 };
      const propertyNames = Object.getOwnPropertyNames(obj);
      
      console.log(propertyNames);   // [ 'name', 'age' ]
      
  9. Object.getOwnPropertySymbols(obj):不可以原型链查找。返回一个数组,包含对象的所有自有 Symbol 类型的属性。

    • 示例:
      const id = Symbol('id');
      const obj = { [id]: 42 };
      const symbols = Object.getOwnPropertySymbols(obj);
      
      console.log(symbols);   // [ Symbol(id) ]
      
  10. Object.getPrototypeOf(obj):不可以原型链查找。返回指定对象的原型。

  • 示例:
    const personProto = { name: 'John', age: 30 };
    const john = Object.create(personProto);
    
    console.log(Object.getPrototypeOf(john));   // { name: 'John', age: 30 }
    
  1. Object.is(value1, value2):不可以原型链查找。判断两个值是否相同(类似于严格相等运算符 ===),返回一个布尔值。
  • 示例:
    console.log(Object.is(1, 1));        // true
    console.log(Object.is({}, {}));      // false
    console.log(Object.is(null, null));  // true
    
  1. Object.isExtensible(obj):不可以原型链查找。判断对象是否可扩展。
  • 示例:
    const obj = {};
    console.log(Object.isExtensible(obj));   // true
    
    Object.preventExtensions(obj);
    console.log(Object.isExtensible(obj));   // false
    
  1. Object.isFrozen(obj):不可以原型链查找。判断对象是否被冻结。
  • 示例:
    const obj = { name: 'John', age: 30 };
    console.log(Object.isFrozen(obj));   // false
    
    Object.freeze(obj);
    console.log(Object.isFrozen(obj));   // true
    
  1. Object.isSealed(obj):不可以原型链查找。判断对象是否被密封。
  • 示例:
    const obj = { name: 'John', age: 30 };
    console.log(Object.isSealed(obj));   // false
    
    Object.seal(obj);
    console.log(Object.isSealed(obj));   // true
    
  1. Object.keys(obj):可以原型链查找。返回一个数组,包含对象的所有可枚举属性的名称。
  • 示例:
    const obj = { name: 'John', age: 30 };
    const keys = Object.keys(obj);
    
    console.log(keys);   // [ 'name', 'age' ]
    
  1. Object.preventExtensions(obj):不可以原型链查找。阻止对象的扩展,使其不可添加新属性。
  • 示例:
    const obj = { name: 'John', age: 30 };
    Object.preventExtensions(obj);
    
    obj.gender = 'Male';    // 添加被禁止
    
    console.log(obj);   // { name: 'John', age: 30 }
    
  1. Object.seal(obj):不可以原型链查找。密封对象,防止添加新属性,但允许修改和删除属性。
  • 示例:
    const obj = { name: 'John', age: 30 };
    Object.seal(obj);
    
    obj.name = 'Jane';      // 可以修改
    delete obj.age;         // 可以删除
    
    console.log(obj);   // { name: 'Jane' }
    
  1. Object.setPrototypeOf(obj, prototype):不可以原型链查找。设置对象的原型(prototype)。
  • 示例:
    const personProto = { name: 'John', age: 30 };
    const john = { occupation: 'Developer' };
    
    Object.setPrototypeOf(john, personProto);
    
    console.log(john.name);   // John
    

Symbol 对象的方法:

  1. Symbol.for(key):不可以原型链查找。根据提供的 key 获取或创建一个全局共享的 symbol。

    • 示例:
      const sym1 = Symbol.for('key');
      const sym2 = Symbol.for('key');
      
      console.log(sym1 === sym2);   // true
      
  2. Symbol.keyFor(sym):不可以原型链查找。返回与指定的 symbol 关联的键。

    • 示例:
      const sym = Symbol.for('key');
      const key = Symbol.keyFor(sym);
      
      console.log(key);   // key
      

这里列出了一些常见的 Object 和 Symbol 的方法,并提供了简单的使用示例。需要注意的是,某些方法只能在特定的 JavaScript 环境中使用,并且能否通过原型链查找取决于方法是否定义在 Object.prototype 或 Symbol.prototype 上。