在 JavaScript(及其超集 TypeScript)中,Object 是基础的内置对象类型,提供了许多功能和方法来操纵和处理对象。以下是 Object 的主要功能和一些常用方法的详解:

1. 创建对象

方法 1:对象字面量

最常见的创建对象的方法:

const person = {
  name: 'Alice',
  age: 18
};

方法 2:Object 构造函数

另一种方式是使用 Object 构造函数:

const person = new Object();
person.name = 'Alice';
person.age = 18;

方法 3:Object.create

使用现有对象作为原型创建新对象:

const prototype = {
  greet() {
    return `Hello, my name is ${this.name}`;
  }
};
 
const person = Object.create(prototype);
person.name = 'Alice';
person.age = 18;
 
console.log(person.greet()); // 输出: Hello, my name is Alice

2. 常用方法

Object.keys

返回对象自身可枚举属性名的数组:

const person = { name: 'Alice', age: 18 };
const keys = Object.keys(person);
console.log(keys); // 输出: ['name', 'age']

Object.values

返回对象自身可枚举属性值的数组:

const person = { name: 'Alice', age: 18 };
const values = Object.values(person);
console.log(values); // 输出: ['Alice', 18]

Object.entries

返回对象自身可枚举属性的键值对数组:

const person = { name: 'Alice', age: 18 };
const entries = Object.entries(person);
console.log(entries); // 输出: [['name', 'Alice'], ['age', 18]]

Object.assign

用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象:

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
 
const returnedTarget = Object.assign(target, source);
console.log(returnedTarget); // 输出: { a: 1, b: 4, c: 5 }
console.log(target);         // 输出: { a: 1, b: 4, c: 5 }

Object.create

使用现有对象作为原型创建新对象:

const prototype = {
  greet() {
    return `Hello, my name is ${this.name}`;
  }
};
 
const person = Object.create(prototype);
person.name = 'Alice';
person.age = 18;
 
console.log(person.greet()); // 输出: Hello, my name is Alice

Object.definePropertyObject.defineProperties

用于在对象上定义新的属性或修改现有属性:

const person = {};
 
Object.defineProperty(person, 'name', {
  value: 'Alice',
  writable: false,  // name 属性不可修改
  enumerable: true, // name 属性可枚举
  configurable: true // name 属性可配置
});
 
console.log(person.name); // 输出: Alice
person.name = 'Bob'; // 由于 writable: false, 修改无效
console.log(person.name); // 输出: Alice

或者同时定义多个属性:

const person = {};
 
Object.defineProperties(person, {
  name: {
    value: 'Alice',
    writable: true,
    enumerable: true
  },
  age: {
    value: 18,
    writable: true,
    enumerable: true
  }
});
 
console.log(person.name); // 输出: Alice
console.log(person.age);  // 输出: 18

Object.freeze

冻结对象,防止对其属性进行修改:

const person = { name: 'Alice', age: 18 };
Object.freeze(person);
 
person.name = 'Bob'; // 修改无效
console.log(person.name); // 输出: Alice

Object.seal

密封对象,防止添加或删除属性,但允许修改现有属性的值:

const person = { name: 'Alice', age: 18 };
Object.seal(person);
 
person.name = 'Bob'; // 修改有效
console.log(person.name); // 输出: Bob
 
delete person.age; // 删除无效
console.log(person.age); // 输出: 18

Object.isFrozen

检查对象是否被冻结:

const person = { name: 'Alice'};
Object.freeze(person);
console.log(Object.isFrozen(person)); // 输出: true

Object.isSealed

检查对象是否被密封:

const person = { name: 'Alice'};
Object.seal(person);
console.log(Object.isSealed(person)); // 输出: true

Object.getOwnPropertyDescriptorObject.getOwnPropertyDescriptors

获取对象属性的描述符:

const person = { name: 'Alice' };
const descriptor = Object.getOwnPropertyDescriptor(person, 'name');
console.log(descriptor);
// 输出: { value: 'Alice', writable: true, enumerable: true, configurable: true }

获取对象所有属性的描述符:

const person = { name: 'Alice', age: 18 };
const descriptors = Object.getOwnPropertyDescriptors(person);
console.log(descriptors);
/*
输出:
{
  name: { value: 'Alice', writable: true, enumerable: true, configurable: true },
  age: { value: 18, writable: true, enumerable: true, configurable: true }
}
*/

Object.getPrototypeOf

获取对象的原型:

const prototype = { greeting: 'Hello' };
const person = Object.create(prototype);
console.log(Object.getPrototypeOf(person) === prototype); // 输出: true

3. 类型检查和其他实用方法

Object.prototype.toString

某些对象的默认 toString 方法会返回对象的类型,而不是 [object Object],这对调试和类型检查非常有用:

console.log(Object.prototype.toString.call([]));         // 输出: [object Array]
console.log(Object.prototype.toString.call({}));         // 输出: [object Object]
console.log(Object.prototype.toString.call(new Date())); // 输出: [object Date]

Object.hasOwnProperty

检查对象是否具有特定属性,而不检查其原型链上的属性:

const person = { name: 'Alice' };
console.log(person.hasOwnProperty('name')); // 输出: true
console.log(person.hasOwnProperty('toString')); // 输出: false

Object.prototype.isPrototypeOf

检查对象是否存在于另一个对象的原型链中:

const prototype = {};
const obj = Object.create(prototype);
console.log(prototype.isPrototypeOf(obj)); // 输出: true

Object.prototype.propertyIsEnumerable

检查对象的指定属性是否可枚举:

const person = { name: 'Alice', age: 18 };
console.log(person.propertyIsEnumerable('name')); // 输出: true
console.log(person.propertyIsEnumerable('toString')); // 输出: false

总结

Object 是 JavaScript 中基础的构造函数,提供了丰富的功能用于创建、操作和检查对象。通过理解并使用这些方法,你可以更高效地管理对象属性和行为,有效提高代码的健壮性和可读性。希望这些详细说明能帮助你更好地理解和应用 TypeScript 和 JavaScript 中的 Object