Object是一个全局对象,是所有对象类型的基础。JavaScript 中的对象实质上是一组“键值对”的集合,这些键值对被称为“属性”。
1. Object.keys(obj)
返回一个给定对象自身的所有可枚举属性名的数组,不包括继承的属性名。
使用 Object.keys 方法可以返回一个对象自身的所有可枚举属性名的数组,不包括继承的属性名。返回的是一个由属性名组成的字符串数组。下面是一个例子:
const obj = { a: 1, b: 2, c: 3 };
const keys = Object.keys(obj);
console.log(keys); // 输出 ["a", "b", "c"]
2. Object.entries(obj)
返回一个给定对象自身的所有可枚举属性的键值对数组,每个元素是一个形如 [key, value] 的数组。
使用 Object.entries 方法可以返回一个对象自身的所有可枚举属性的键值对数组。每个元素都是一个形如 [key, value] 的数组,其中 key 是属性名,value 是属性值。下面是一个例子:
const obj = { a: 1, b: 2, c: 3 };
const entries = Object.entries(obj);
console.log(entries); // 输出 [["a", 1], ["b", 2], ["c", 3]]
3. Object.assign(target, source1, source2, ...)
将一个或多个源对象的属性复制到目标对象中,并返回目标对象。如果有多个源对象具有相同的属性,则后面的属性会覆盖前面的属性。
使用 Object.assign 方法可以将一个或多个源对象的属性复制到目标对象中,并返回目标对象。如果有多个源对象具有相同的属性,则后面的属性会覆盖前面的属性。下面是一个例子:
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const result = Object.assign(target, source);
console.log(result); // 输出 { a: 1, b: 4, c: 5 }
4. Object.create(proto, [propertiesObject])
创建一个新对象,使用现有对象提供新创建的对象的__proto__。可以通过第二个可选参数向新对象添加属性和属性描述符。
使用 Object.create 方法可以创建一个新对象,使用现有对象提供新创建的对象的 proto。可以通过第二个可选参数向新对象添加属性和属性描述符。下面是一个例子:
const obj1 = { a: 1 };
const obj2 = Object.create(obj1);
console.log(obj2.a); // 输出 1
const obj3 = Object.create(obj1, {
b: {
value: 2,
},
});
console.log(obj3.b); // 输出 2
5. Object.freeze(obj)
冻结一个对象,使其不可更改。一旦一个对象被冻结,在它上面就不能添加、删除或者修改属性。
使用 Object.freeze 方法可以冻结一个对象,使其不可更改。一旦一个对象被冻结,在它上面就不能添加、删除或者修改属性。下面是一个例子:
const obj = Object.freeze({ a: 1, b: 2 });
obj.c = 3;
console.log(obj); // 输出 { a: 1, b: 2 }
6. Object.seal(obj)
封闭一个对象,阻止添加新属性,并将所有现有属性标记为不可配置。但属性的值仍然可以修改。
使用 Object.seal 方法可以封闭一个对象,阻止添加新属性,并将所有现有属性标记为不可配置。但属性的值仍然可以修改。下面是一个例子:
const obj = { a: 1, b: 2 };
Object.seal(obj);
delete obj.b;
obj.a = 4;
console.log(obj); // 输出 { a: 4, b: 2 }
7. Object.getOwnPropertyNames(obj)
返回一个数组,包含目标对象自身的所有属性的属性名,包括不可枚举属性和 Symbol 类型的属性名。
const obj = { a: 1 };
const symbols = Symbol("test");
Object.defineProperty(obj, "b", {
value: 2,
enumerable: false,
});
Object.defineProperty(obj, symbols, {
value: 3,
enumerable: true,
});
const names = Object.getOwnPropertyNames(obj);
console.log(names); // 输出 ["a", "b"]
8. Object.getOwnPropertyDescriptor(obj, prop)
获取一个属性的描述对象,包括它的 value、writable、enumerable、configurable 等属性。
const obj = {
a: 1,
get b() {
return 2;
},
};
const desc1 = Object.getOwnPropertyDescriptor(obj, "a");
console.log(desc1); // 输出 {value: 1, writable: true, enumerable: true, configurable: true}
const desc2 = Object.getOwnPropertyDescriptor(obj, "b");
console.log(desc2); // 输出 {get: ƒ, set: undefined, enumerable: true, configurable: true}
9. Object.fromEntries(iterable):
将一个包含键值对的可迭代对象转换为一个对象
const arr = [
["a", 1],
["b", 2],
];
const obj = Object.fromEntries(arr);
console.log(obj); // 输出 {a: 1, b: 2}
10. Object.defineProperties(obj, props)
是一个方法,可以定义或修改一个对象的多个属性,该方法接受两个参数:
obj:需要定义属性的对象。props:一个对象,它自身包含了一些属性描述符(property descriptors)。
该方法可以为一个对象同时定义或修改多个属性,这些属性都是直接作用于这个对象自身,所以不会从对象的原型链上继承属性。
下面是一个使用 Object.defineProperties 方法的示例,其中定义了一个名为 person 的对象,并使用 defineProperties 方法定义了它的两个属性:
const person = {};
Object.defineProperties(person, {
firstName: {
value: "张",
writable: true,
enumerable: true,
},
lastName: {
value: "三",
writable: true,
enumerable: true,
},
fullName: {
get() {
return this.firstName + " " + this.lastName;
},
set(name) {
[this.firstName, this.lastName] = name.split(" ");
},
enumerable: true,
},
});
console.log(person.firstName); // "张"
console.log(person.lastName); // "三"
console.log(person.fullName); // "张 三"
person.fullName = "李四";
console.log(person.fullName); // "李 四"
在上述示例中,我们成功地定义了 person 对象的三个属性 firstName、lastName 和 fullName。其中,firstName 和 lastName 属性的配置均为 {value: "xxx", writable: true, enumerable: true},因此它们实际上是常规的数据属性。而 fullName 属性的配置为 {get: fn, set: fn, enumerable: true},因此它是一个访问器属性,同时又支持赋值操作。
11.Object.hasOwnProperty(propName)
方法用于判断一个对象是否具有指定名称的属性,其中 propName 表示属性名。该方法是 JavaScript 中的原型方法,可以被所有对象调用。
具体来说,当我们调用 Object.hasOwnProperty(propName) 方法时,它会检查当前对象是否具有名为 propName 的属性。如果当前对象具有 propName 属性,则该方法返回 true,否则返回 false。
下面是一个示例,其中我们创建了一个 person 对象,并检查它是否具有指定名称的属性:
const person = {
name: "张三",
age: 18,
gender: "男",
};
console.log(person.hasOwnProperty("name")); // true
console.log(person.hasOwnProperty("address")); // false
在上面的示例中,我们创建了一个 person 对象,它包含了 name、age 和 gender 三个属性。我们首先调用了 person.hasOwnProperty("name") 方法,该方法返回 true,表示 person 对象确实具有 name 属性。接着我们调用了 person.hasOwnProperty("address") 方法,该方法返回 false,表示 person 对象不具有 address 属性。