Skip to content

对象常用方法临记

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 }

最佳实践建议

  1. 优先使用新语法:如展开运算符 ... 代替 Object.assign()
  2. 属性枚举时:注意 for...in 会遍历原型链,通常需要配合 hasOwnProperty 检查
  3. 不可变操作:使用 Object.freeze() 创建不可变对象时要注意是浅冻结
  4. 性能敏感场景:避免频繁使用 Object.setPrototypeOf()
  5. 元编程:结合 ReflectProxy 实现高级模式

完整方法速查表

分类方法说明版本
创建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

made with ❤️ by ankang