对象常用方法临记
javascript
// 1. 字面量创建
const obj1 = {};
// 2. Object构造函数
const obj2 = new Object();
// 3. Object.create() - 指定原型
const protoObj = { x: 1 };
const obj3 = Object.create(protoObj); // obj3.__proto__ === protoObj
// 4. Object.fromEntries() - 键值对数组转对象
const entries = [['a', 1], ['b', 2]];
const obj4 = Object.fromEntries(entries); // {a: 1, b: 2}
javascript
// 获取原型
Object.getPrototypeOf(obj);
// 设置原型(性能差,不推荐)
Object.setPrototypeOf(obj, proto);
// 检查是否是原型
protoObj.isPrototypeOf(obj);
javascript
// 定义/修改属性
Object.defineProperty(obj, 'prop', {
value: 42,
writable: true, // 可写
enumerable: true, // 可枚举
configurable: true // 可配置
});
// 批量定义属性
Object.defineProperties(obj, {
prop1: { value: 1 },
prop2: { value: 2 }
});
// 获取属性描述符
Object.getOwnPropertyDescriptor(obj, 'prop');
Object.getOwnPropertyDescriptors(obj); // ES2017
javascript
// 检查属性存在
'prop' in obj; // 包括原型链
Reflect.has(obj, 'prop') // 包括原型链
Object.hasOwn(obj, 'prop'); // ES2022,仅自身属性
obj.hasOwnProperty('prop'); // 传统方式(可能被覆盖)
// 获取属性名数组
Object.keys(obj); // 可枚举的自身属性
Object.getOwnPropertyNames(obj); // 所有自身属性(包括不可枚举)
Object.getOwnPropertySymbols(obj); // 所有Symbol属性
Reflect.ownKeys(obj); // 所有自身键 包含不可枚举(包括Symbol)
javascript
// 禁止添加新属性
Object.preventExtensions(obj);
// 密封对象(不能添加/删除属性,现有属性不可配置)
Object.seal(obj);
// 冻结对象(密封 + 不可修改属性值)
Object.freeze(obj);
// 检查状态
Object.isExtensible(obj);
Object.isSealed(obj);
Object.isFrozen(obj);
javascript
// 浅拷贝
const clone = Object.assign({}, source); // ES6
const clone = { ...source }; // ES2018展开运算符
// 深拷贝(简易版,有局限性)
const deepClone = JSON.parse(JSON.stringify(obj));
// 合并对象
Object.assign(target, src1, src2); // 覆盖式合并
const merged = { ...obj1, ...obj2 };
javascript
// for...in (包括原型链的可枚举属性)
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
// Object.entries() + forEach (ES2017)
Object.entries(obj).forEach(([key, value]) => {
console.log(key, value);
});
// Object.keys() + for...of
for (const key of Object.keys(obj)) {
console.log(key, obj[key]);
}
javascript
// 转为键值对数组
Object.entries(obj); // [['key1', value1], ['key2', value2]]
// 对象转Map
const map = new Map(Object.entries(obj));
// 转为原始值
obj.toString(); // 默认返回 "[object Object]"
obj.valueOf(); // 默认返回对象本身
javascript
// 浅比较
Object.is(obj1, obj2); // 类似 ===,但处理了 NaN 和 +0/-0 的特殊情况
// Object.is(NaN, NaN) => true
// Object.is(+0, -0) => false
console.log(obj.__proto__.isPrototypeOf(obj)) // true
console.log(NaN === NaN) // false
console.log(+0 === -0) // true
console.log(Object.is(NaN, NaN)) // true
console.log(Object.is(0, -0)) // false
console.log(Object.is(+0, -0)) // false
javascript
// 实例方法
obj.hasOwnProperty('prop');
obj.propertyIsEnumerable('prop');
obj.toString();
obj.toLocaleString(); // 本地化字符串表示
javascript
// 获取值数组
Object.values(obj); // ES2017
// 属性名表达式
const dynamicKey = 'name';
const obj = {
[dynamicKey]: 'John', // 计算属性名
[`get_${dynamicKey}`]() { return this[dynamicKey]; }
};
javascript
const { a, b: renamed, ...rest } = obj;
// 等效于:
// const a = obj.a;
// const renamed = obj.b;
// const rest = 剩余属性
let obj2 = {
a: 1,
b: 2,
c: 3,
d: 4
}
const { a, b, ...res } = obj2
console.log(res);// { c: 3, d: 4 }最佳实践建议
- 优先使用新语法:如展开运算符
...代替Object.assign() - 属性枚举时:注意
for...in会遍历原型链,通常需要配合hasOwnProperty检查 - 不可变操作:使用
Object.freeze()创建不可变对象时要注意是浅冻结 - 性能敏感场景:避免频繁使用
Object.setPrototypeOf() - 元编程:结合
Reflect和Proxy实现高级模式
完整方法速查表
| 分类 | 方法 | 说明 | 版本 |
|---|---|---|---|
| 创建 | Object.create() | 创建带指定原型的对象 | ES5 |
| 创建 | Object.fromEntries() | 键值对数组转对象 | ES2019 |
| 属性 | Object.defineProperty() | 定义/修改属性 | ES5 |
| 属性 | Object.defineProperties() | 批量定义属性 | ES5 |
| 属性 | Object.getOwnPropertyDescriptor() | 获取属性描述符 | ES5 |
| 属性 | Object.getOwnPropertyDescriptors() | 获取所有属性描述符 | ES2017 |
| 属性 | Object.hasOwn() | 检查自身属性 | ES2022 |
| 键名 | Object.keys() | 获取可枚举的自身属性名 | ES5 |
| 键名 | Object.getOwnPropertyNames() | 获取所有自身属性名 | ES5 |
| 键名 | Object.getOwnPropertySymbols() | 获取Symbol属性名 | ES6 |
| 值 | Object.values() | 获取可枚举的自身属性值 | ES2017 |
| 键值 | Object.entries() | 获取可枚举的自身键值对 | ES2017 |
| 原型 | Object.getPrototypeOf() | 获取原型 | ES5 |
| 原型 | Object.setPrototypeOf() | 设置原型 | ES6 |
| 状态 | Object.preventExtensions() | 禁止扩展 | ES5 |
| 状态 | Object.seal() | 密封对象 | ES5 |
| 状态 | Object.freeze() | 冻结对象 | ES5 |
| 状态 | Object.isExtensible() | 检查是否可扩展 | ES5 |
| 状态 | Object.isSealed() | 检查是否密封 | ES5 |
| 状态 | Object.isFrozen() | 检查是否冻结 | ES5 |
| 比较 | Object.is() | 值比较 | ES6 |
| 复制 | Object.assign() | 浅拷贝合并 | ES6 |
