Object
Object.create()
Object.create()
静态方法以一个现有对象作为原型,创建一个新对象。
- 语法
- 示例
proto
新创建对象的原型对象。
propertiesObject
如果该参数被指定且不为
undefined
,则该传入对象可枚举的自有属性将为新创建的对象添加具有对应属性名称的属性描述符。这些属性对应于Object.defineProperties()
的第二个参数。
返回值
根据指定的原型对象和属性创建的新对象。
异常
如果 proto
既不是 null
,也不是 Object,则抛出 TypeError。
Object.create(proto);
Object.create(proto, propertiesObject);
通过 Object.create()
方法,可以利用原型链的特性来实现对象之间的继承关系,非常有用于面向对象的 JavaScript 编程。
Object.assign()
从一个或多个源对象复制所有 可枚举的自有属性到目标对象,并返回目标对象。
Object.assign()
执行的是浅拷贝,而不是深拷贝。如果源对象的属性是对象,则只会复制对象的引用。
- 语法
- 示例
target
目标对象,将接收来自源对象的属性。
sources
一个或多个源对象,包含将被复制到目标对象的属性。
返回值
返回目标对象 target
。
Object.assign(target, source1, source2);
Object.keys()
Object.keys()
静态方法返回一个由给定对象自身的可枚举的字符串键属性名组成的数组。
const person = {
name: 'mofan',
age: '23',
address: 'China',
};
console.log(Object.keys(person)); // [ 'name', 'age', 'address' ]
Object.values()
Object.values()
静态方法返回一个给定对象的自有可枚举字符串键属性值组成的数组。
const person = {
name: 'mofan',
age: '23',
address: 'China',
};
console.log(Object.values(person)); // [ 'mofan', '23', 'China' ]
Object.entries()
Object.entries()
静态方法返回一个包含给定对象自有的可枚举字符串键属性的键值对的数值(二维数组)。
const person = {
name: 'mofan',
age: '23',
address: 'China',
};
console.log(Object.entries(person)); // [ [ 'name', 'mofan' ], [ 'age', '23' ], [ 'address', 'China' ] ]
Object.fromEntries()
Object.fromEntries()
静态方法将键值对列表转换为一个对象。
const person = [
['name', 'mofan'],
['age', '23'],
['address', 'China'],
];
console.log(Object.fromEntries(person)); // { name: 'mofan', age: '23', address: 'China' }
Object.freeze()
Object.freeze()
静态方法可以使一个对象被冻结。冻结对象可以防止扩展,并使现有的属性不可写入和不可配置。被冻结的对象不能再被更改:不能添加新的属性,不能移除现有的属性,不能更改它们的可枚举性、可配置性、可写性或值,对象的原型也不能被重新指定。freeze()
返回与传入的对象相同的对象。
冻结一个对象是 JavaScript 提供的最高完整性级别保护措施。
const person = {
name: 'mofan',
age: '23',
address: 'China',
};
const freezePerson = Object.freeze(person);
console.log(freezePerson === person); // true
// 严格模式下抛出异常,非严格模式静默失败
person.age = 30;
Object.seal()
Object.seal()
静态方法密封一个对象。密封一个对象会阻止其扩展并且使得现有属性不可配置。密封对象有一组固定的属性:不能添加新属性、不能删除现有属性或更改其可枚举性和可配置性、不能重新分配其原型。只要现有属性的值是可写的,它们仍然可以更改。seal()
返回传入的同一对象。
const person = {
name: 'mofan',
age: '23',
address: 'China',
};
const sealPerson = Object.seal(person);
console.log(sealPerson === person); // true
// 非严格模式下静默失败,严格模式下抛出异常
person.gender = '男';
// 可修改属性
person.name = 'coder_mofan';
console.log(person); // { name: 'coder_mofan', age: '23', address: 'China' }
Object.freeze
和 Object.seal
区别前者冻结对象,防止修改对象及其属性。已冻结的对象不可添加新属性,不可删除现有属性,也不可修改属性的值。后者密封对象,防止添加或删除属性,但可以修改现有属性。
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptor()
静态方法返回一个对象,该对象描述给定对象上特定属性(即直接存在于对象上而不在对象的原型链中的属性)的配置。返回的对象是可变的,但对其进行更改不会影响原始属性的配置。
const person = {
name: 'mofan',
age: '23',
address: 'China',
};
let descriptor = Object.getOwnPropertyDescriptor(person, 'name');
console.log(descriptor.configurable); // true
console.log(descriptor.value); // mofan
descriptor.value = 'wohu';
console.log(descriptor.value); // wohu
// 不会影响原始属性的配置
console.log(person.name); // mofan
Object.getOwnPropertyDescriptors()
Object.getOwnPropertyDescriptors()
静态方法返回给定对象的所有自有属性描述符。
const person = {
name: 'mofan',
age: '23',
address: 'China',
};
let descriptors = Object.getOwnPropertyDescriptors(person);
console.log(descriptors);
/**
{
name: {
value: 'mofan',
writable: true,
enumerable: true,
configurable: true
},
age: { value: '23', writable: true, enumerable: true, configurable: true },
address: {
value: 'China',
writable: true,
enumerable: true,
configurable: true
}
}
*/
Object.getPrototypeOf()
Object.getPrototypeOf()
静态方法返回指定对象的原型(即内部 [[Prototype]]
属性的值)。它返回对象的原型对象,或者 null
如果该对象没有继承属性。
// 创建一个原型对象
const proto = {
greet() {
return 'Hello!';
},
};
// 创建一个对象,设置其原型为 `proto`
const obj = Object.create(proto);
console.log(Object.getPrototypeOf(obj) === proto); // true
// 验证继承性
console.log(obj.greet()); // "Hello!"
Object.defineProperty()
Object. ()
静态方法会直接在一个对象上定义一个新属性,或修改其现有属性,并返回此对象。
const person = {};
Object.defineProperty(person, 'name', {
value: 'mofan',
writable: false,
enumerable: true,
});
console.log(person); // { name: 'mofan' }
Object.defineProperties()
Object.defineProperties()
静态方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。相比较 defineProperty
可以配置多个属性。
const person = {};
Object.defineProperties(person, {
name: {
value: 'mofan',
writable: false,
enumerable: true,
},
age: {
value: 23,
writable: true,
enumerable: true,
},
address: {
value: 'China',
writable: true,
enumerable: true,
},
});
console.log(person); // { name: 'mofan', age: 23, address: 'China' }
Object.hasOwn()
如果指定的对象自身有指定的属性,则静态方法 Object.hasOwn()
返回 true。如果属性是继承的或者不存在,该方法返回 false。
const object1 = {
prop: 'exists',
};
console.log(Object.hasOwn(object1, 'prop'));
// 输出: true
console.log(Object.hasOwn(object1, 'toString'));
// 输出: false
console.log(Object.hasOwn(object1, 'undeclaredPropertyValue'));
// 输出: false