JavaScript 中的 Object 是所有其他对象的基础原型。Object 对象提供了一些非常有用的静态方法和原型方法,用于操作和检查对象。下面列出了一些常用的 Object 方法,并提供了详细的代码示例和说明。
1. Object.create()
用途:创建一个新对象,使用现有的对象来提供新创建的对象的原型链。
示例:
const personPrototype = {
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
const person = Object.create(personPrototype);
person.name = "John Doe";
person.greet(); // 输出: Hello, my name is John Doe
2. Object.defineProperty()
用途:直接在一个对象上定义一个新的属性或修改一个现有属性,并返回该对象。
示例:
const person = {};
Object.defineProperty(person, 'name', {
value: 'John Doe',
writable: true,
enumerable: true,
configurable: true
});
console.log(person.name); // 输出: John Doe
3. Object.getOwnPropertyDescriptor()
用途:返回指定对象上一个自有属性的描述符。
示例:
const person = {
name: 'John Doe'
};
const descriptor = Object.getOwnPropertyDescriptor(person, 'name');
console.log(descriptor); // 输出: { value: 'John Doe', writable: true, enumerable: true, configurable: true }
4. Object.keys(), Object.values(), Object.entries()
用途:分别返回对象的所有自身属性的键、值和键值对数组。
示例:
const person = {
name: 'John Doe',
age: 30
};
console.log(Object.keys(person)); // 输出: ['name', 'age']
console.log(Object.values(person)); // 输出: ['John Doe', 30]
console.log(Object.entries(person)); // 输出: [['name', 'John Doe'], ['age', 30]]
5. Object.assign()
用途:将所有可枚举的属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
示例:
const person = {
name: 'John Doe'
};
const details = {
age: 30,
gender: 'male'
};
const combined = Object.assign({}, person, details);
console.log(combined); // 输出: { name: 'John Doe', age: 30, gender: 'male' }
6. Object.freeze()
用途:冻结一个对象。冻结后的对象不能再被扩展;不能添加新的属性;已存在的属性也不能被删除;已存在的数据描述符属性不能被重新配置或修改其属性值。
示例:
const person = {
name: 'John Doe'
};
const frozenPerson = Object.freeze(person);
frozenPerson.name = 'Jane Doe'; // 尝试修改,但不会成功
console.log(frozenPerson.name); // 输出: John Doe
7. Object.is()
用途:确定两个值是否为同一个值。对于 NaN 和 -0 这样的特殊情况,Object.is 提供了更准确的比较。
示例:
console.log(Object.is(NaN, NaN)); // 输出: true
console.log(Object.is(-0, 0)); // 输出: false
8. Object.setPrototypeOf()
用途:设置一个对象的原型([[Prototype]])到另一个对象或 null。
示例:
const personPrototype = {
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
const person = {};
Object.setPrototypeOf(person, personPrototype);
person.name = "John Doe";
person.greet(); // 输出: Hello, my name is John Doe
9. Object.getPrototypeOf()
用途:返回指定对象的原型([[Prototype]])。
示例:
const personPrototype = {
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
const person = Object.create(personPrototype);
person.name = "John Doe";
const prototype = Object.getPrototypeOf(person);
console.log(prototype === personPrototype); // 输出: true
10. Object.hasOwnProperty()
用途:返回一个布尔值,指示对象是否有指定的自有属性。
示例:
const person = {
name: 'John Doe'
};
console.log(person.hasOwnProperty('name')); // 输出: true
console.log(person.hasOwnProperty('age')); // 输出: false
除了之前提到的方法之外,JavaScript 的 Object 对象还提供了许多其他有用的方法。下面是一些额外的方法及其用途和示例:
11. Object.getOwnPropertyDescriptor()
用途:返回指定对象上一个自有属性的描述符。
示例:
const person = {
name: 'John Doe'
};
const descriptor = Object.getOwnPropertyDescriptor(person, 'name');
console.log(descriptor); // 输出: { value: 'John Doe', writable: true, enumerable: true, configurable: true }
12. Object.getOwnPropertyNames()
用途:返回一个由指定对象的所有自身属性的属性名组成的数组。
示例:
const person = {
name: 'John Doe',
age: 30
};
const names = Object.getOwnPropertyNames(person);
console.log(names); // 输出: ['name', 'age']
13. Object.getOwnPropertySymbols()
用途:返回一个由指定对象的所有自身属性的符号键组成的数组。
示例:
const symbolKey = Symbol('secret');
const person = {
name: 'John Doe',
[symbolKey]: 'Secret information'
};
const symbols = Object.getOwnPropertySymbols(person);
console.log(symbols); // 输出: [Symbol(secret)]
14. Object.getPrototypeOf()
用途:返回指定对象的原型。
示例:
const personPrototype = {
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
const person = Object.create(personPrototype);
person.name = "John Doe";
const prototype = Object.getPrototypeOf(person);
console.log(prototype === personPrototype); // 输出: true
15. Object.setPrototypeOf()
用途:设置一个对象的原型([[Prototype]])到另一个对象或 null。
示例:
const personPrototype = {
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
const person = {};
Object.setPrototypeOf(person, personPrototype);
person.name = "John Doe";
person.greet(); // 输出: Hello, my name is John Doe
16. Object.isFrozen()
用途:返回一个布尔值,指示对象是否已经被冻结。
示例:
const person = {
name: 'John Doe'
};
const frozenPerson = Object.freeze(person);
console.log(Object.isFrozen(person)); // 输出: true
17. Object.isSealed()
用途:返回一个布尔值,指示对象是否已经被密封。
示例:
const person = {
name: 'John Doe'
};
const sealedPerson = Object.seal(person);
console.log(Object.isSealed(person)); // 输出: true
18. Object.preventExtensions()
用途:阻止一个对象添加新的属性。
示例:
const person = {
name: 'John Doe'
};
Object.preventExtensions(person);
try {
person.age = 30; // 尝试添加新属性
} catch (e) {
console.log(e.message); // 输出: Cannot add property age, object is not extensible
}
19. Object.isExtensible()
用途:返回一个布尔值,指示对象是否可以添加新的属性。
示例:
const person = {
name: 'John Doe'
};
const extendedPerson = Object.preventExtensions(person);
console.log(Object.isExtensible(person)); // 输出: false
20. Object.seal()
用途:密封一个对象。密封后的对象不能再被扩展;不能添加新的属性;已存在的属性也不能被删除;但已存在的数据描述符属性可以被重新配置或修改其属性值。
示例:
const person = {
name: 'John Doe'
};
const sealedPerson = Object.seal(person);
try {
delete person.name; // 尝试删除属性
} catch (e) {
console.log(e.message); // 输出: Cannot delete property 'name' of #<Object>
}
21. Object.keys()
用途:返回一个由一个对象自身的可枚举属性名组成的数组。
示例:
const person = {
name: 'John Doe',
age: 30
};
const keys = Object.keys(person);
console.log(keys); // 输出: ['name', 'age']
22. Object.values()
用途:返回一个由一个对象自身的可枚举属性值组成的数组。
示例:
const person = {
name: 'John Doe',
age: 30
};
const values = Object.values(person);
console.log(values); // 输出: ['John Doe', 30]
23. Object.entries()
用途:返回一个由一个对象自身的可枚举属性的 [key, value] 对组成的数组。
示例:
const person = {
name: 'John Doe',
age: 30
};
const entries = Object.entries(person);
console.log(entries); // 输出: [['name', 'John Doe'], ['age', 30]]
总结
这些方法提供了强大的工具来操作和检查 JavaScript 中的对象。通过使用这些方法,你可以更好地理解和控制对象的行为。这些方法对于编写复杂的应用程序尤其有用,尤其是在需要处理大量的数据和对象的情况下。