在 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 Alice2. 常用方法
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 AliceObject.defineProperty 和 Object.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); // 输出: 18Object.freeze
冻结对象,防止对其属性进行修改:
const person = { name: 'Alice', age: 18 };
Object.freeze(person);
person.name = 'Bob'; // 修改无效
console.log(person.name); // 输出: AliceObject.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); // 输出: 18Object.isFrozen
检查对象是否被冻结:
const person = { name: 'Alice'};
Object.freeze(person);
console.log(Object.isFrozen(person)); // 输出: trueObject.isSealed
检查对象是否被密封:
const person = { name: 'Alice'};
Object.seal(person);
console.log(Object.isSealed(person)); // 输出: trueObject.getOwnPropertyDescriptor 和 Object.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); // 输出: true3. 类型检查和其他实用方法
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')); // 输出: falseObject.prototype.isPrototypeOf
检查对象是否存在于另一个对象的原型链中:
const prototype = {};
const obj = Object.create(prototype);
console.log(prototype.isPrototypeOf(obj)); // 输出: trueObject.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。