在JavaScript中,Object
是一个全局对象,它有很多有用的静态方法可以用来处理对象。以下是一些常用的 Object
函数:
1. 创建
assign()
- 用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它返回目标对象。
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target); // { a: 1, b: 4, c: 5 }
create()
- 创建一个新对象,使用现有的对象来提供新创建的对象的原型。
const person = {
isHuman: false,
printIntroduction: function() {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
}
};
const me = Object.create(person);
me.name = 'Matthew'; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten
me.printIntroduction();
// Expected output: "My name is Matthew. Am I human? true"
2. 遍历
entries()
- 返回一个包含对象自身可枚举属性键值对数组的数组。
const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]
keys()
- 返回一个包含对象自身可枚举属性名称的数组。
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.keys(obj)); // ['a', 'b', 'c']
values()
- 返回一个包含对象自身可枚举属性值的数组。
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.values(obj)); // [1, 2, 3]
3. 属性相关
defineProperty()
- 直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
const obj = {};
Object.defineProperty(obj, 'property1', {
value: 42,
writable: false
});
console.log(obj.property1); // 42
obj.property1 = 77; // No error thrown, but the assignment is ignored.
console.log(obj.property1); // 42
defineProperties()
- 直接在一个对象上定义多个新属性或修改现有属性。
const obj = {};
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'Hello',
writable: false
}
// etc. etc.
});
hasOwnProperty()
- hasOwnProperty 方法用于检查一个对象是否拥有某个自有属性,即不是继承自原型链的属性。
Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。在支持 Object.hasOwn 的浏览器中,建议使用 Object.hasOwn(),而非 hasOwnProperty()。
const obj = { a: 1, b: 2 };
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('c')); // false
4.特殊处理
freeze()
- 冻结一个对象,其他代码不能删除或更改任何属性。
const obj = {
prop: 42
};
Object.freeze(obj);
obj.prop = 33;
// Throws an error in strict mode
console.log(obj.prop);
// Expected output: 42
seal()
- 封闭一个对象,阻止添加新属性并将现有属性标记为不可配置。当前属性的值只要可写就可以改变。
const obj = {
prop: 42
};
Object.seal(obj);
obj.prop = 33;
console.log(obj.prop);
// Expected output: 33
delete obj.prop; // Cannot delete when sealed
console.log(obj.prop);
// Expected output: 33
preventExtensions()
- 阻止一个对象添加新属性。
const obj = {
a: 1
};
Object.preventExtensions(obj);
obj.b = 2;
console.log(obj.b);
// Expected output: undefined
这些方法提供了强大的工具来处理和操作JavaScript中的对象。它们在处理对象时非常有用,无论是创建新对象、修改现有对象,还是检查对象的属性。
is()
- 判断两个值是否为同一个值。
console.log(Object.is(25, 25)); // true
console.log(Object.is('foo', 'foo')); // true
console.log(Object.is(null, null)); // true
console.log(Object.is(undefined, undefined)); // true
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is(-0, +0)); // false
fromEntries()
- 把键值对列表转换为一个对象。
const entries = new Map([
['foo', 'bar'],
['baz', 42]
]);
const obj = Object.fromEntries(entries);
console.log(obj);
// { foo: "bar", baz: 42 }
这些方法提供了对对象属性的精细控制,以及对象原型链的管理。在使用这些方法时,了解它们的具体行为和可能的性能影响是很重要的。