JavaScript 对象方法是操作对象的重要工具。以下是主要对象方法,分为静态方法(Object构造函数上的方法)和实例方法(Object.prototype上的方法)。
一、 静态方法(Object构造函数的方法)
创建和定义对象
-
Object.create(proto, [propertiesObject]): 使用指定的原型对象和属性创建一个新对象。const proto = { greet: function() { return "Hello" } }; const obj = Object.create(proto, { name: { value: "John", writable: true } }); console.log(obj.greet()); // 输出: Hello -
Object.assign(target, ...sources): 将所有可枚举的自有属性从一个或多个源对象复制到目标对象,返回目标对象。const target = { a: 1 }; const source = { b: 2, c: 3 }; Object.assign(target, source); console.log(target); // 输出: { a: 1, b: 2, c: 3 } -
Object.defineProperty(obj, prop, descriptor): 在对象上定义新属性或修改现有属性,并返回该对象。const obj = {}; Object.defineProperty(obj, 'readOnlyProp', { value: 42, writable: false }); console.log(obj.readOnlyProp); // 输出: 42 obj.readOnlyProp = 100; // 静默失败(严格模式会报错) -
Object.defineProperties(obj, props): 在对象上定义多个属性。const obj = {}; Object.defineProperties(obj, { prop1: { value: 'value1', writable: true }, prop2: { value: 'value2', writable: false } });
获取对象信息
-
Object.keys(obj): 返回对象自身可枚举属性名的数组。const obj = { a: 1, b: 2 }; console.log(Object.keys(obj)); // 输出: ['a', 'b'] -
Object.values(obj): 返回对象自身可枚举属性值的数组。console.log(Object.values(obj)); // 输出: [1, 2] -
Object.entries(obj): 返回对象自身可枚举属性键值对的数组。console.log(Object.entries(obj)); // 输出: [['a', 1], ['b', 2]] -
Object.fromEntries(iterable): 将键值对列表转换为对象(Object.entries的逆操作)。const entries = [['a', 1], ['b', 2]]; console.log(Object.fromEntries(entries)); // 输出: { a: 1, b: 2 } -
Object.getOwnPropertyNames(obj): 返回对象所有自身属性(包括不可枚举,不包括Symbol)的数组。const obj = {}; Object.defineProperty(obj, 'hidden', { value: 1, enumerable: false }); console.log(Object.getOwnPropertyNames(obj)); // 输出: ['hidden'] console.log(Object.keys(obj)); // 输出: [] -
Object.getOwnPropertySymbols(obj): 返回对象自身所有Symbol属性的数组。const sym = Symbol('id'); const obj = { [sym]: 123, name: 'test' }; console.log(Object.getOwnPropertySymbols(obj)); // 输出: [Symbol(id)] -
Object.getOwnPropertyDescriptor(obj, prop): 返回指定属性的描述符对象。const desc = Object.getOwnPropertyDescriptor({a: 1}, 'a'); console.log(desc); // 输出: {value: 1, writable: true, enumerable: true, configurable: true} -
Object.getOwnPropertyDescriptors(obj): 返回对象所有自身属性的描述符。const descs = Object.getOwnPropertyDescriptors({a: 1, b: 2}); console.log(descs.a.value); // 输出: 1
原型相关
-
Object.getPrototypeOf(obj): 返回指定对象的原型。const proto = { x: 10 }; const obj = Object.create(proto); console.log(Object.getPrototypeOf(obj) === proto); // 输出: true -
Object.setPrototypeOf(obj, prototype): 设置对象的原型。const obj = {}; const newProto = { x: 20 }; Object.setPrototypeOf(obj, newProto); console.log(obj.x); // 输出: 20
对象状态控制
-
Object.freeze(obj): 冻结对象,不可添加/删除/修改属性,也不可修改属性描述符。const obj = { prop: 42 }; Object.freeze(obj); obj.prop = 33; // 静默失败(严格模式报错) console.log(obj.prop); // 输出: 42 -
Object.seal(obj): 密封对象,不可添加/删除属性,但可修改现有属性值。const obj = { prop: 42 }; Object.seal(obj); delete obj.prop; // 静默失败 obj.prop = 100; // 允许修改 console.log(obj.prop); // 输出: 100 -
Object.preventExtensions(obj): 阻止对象添加新属性,但可删除和修改现有属性。const obj = { prop: 42 }; Object.preventExtensions(obj); obj.newProp = 100; // 静默失败 delete obj.prop; // 允许删除 console.log(obj); // 输出: {}
状态检查
-
Object.is(value1, value2): 判断两个值是否相同(类似===,但解决了NaN和±0的问题)。console.log(Object.is(NaN, NaN)); // 输出: true console.log(Object.is(+0, -0)); // 输出: false console.log(NaN === NaN); // 输出: false -
Object.isExtensible(obj): 判断对象是否可扩展。const obj = {}; console.log(Object.isExtensible(obj)); // 输出: true Object.preventExtensions(obj); console.log(Object.isExtensible(obj)); // 输出: false -
Object.isSealed(obj): 判断对象是否被密封。const obj = {}; console.log(Object.isSealed(obj)); // 输出: false Object.seal(obj); console.log(Object.isSealed(obj)); // 输出: true -
Object.isFrozen(obj): 判断对象是否被冻结。const obj = {}; console.log(Object.isFrozen(obj)); // 输出: false Object.freeze(obj); console.log(Object.isFrozen(obj)); // 输出: true
二、 实例方法(Object.prototype上的方法)
-
hasOwnProperty(prop): 判断对象自身(非继承)是否具有指定属性。const obj = { a: 1 }; console.log(obj.hasOwnProperty('a')); // 输出: true console.log(obj.hasOwnProperty('toString')); // 输出: false(继承的) -
isPrototypeOf(object): 判断对象是否在另一个对象的原型链上。const proto = { x: 10 }; const obj = Object.create(proto); console.log(proto.isPrototypeOf(obj)); // 输出: true -
propertyIsEnumerable(prop): 判断指定属性是否可枚举。const obj = { a: 1 }; Object.defineProperty(obj, 'b', { value: 2, enumerable: false }); console.log(obj.propertyIsEnumerable('a')); // 输出: true console.log(obj.propertyIsEnumerable('b')); // 输出: false -
toString(): 返回对象的字符串表示。const obj = { a: 1 }; console.log(obj.toString()); // 输出: [object Object] console.log(Object.prototype.toString.call([])); // 输出: [object Array] -
toLocaleString(): 返回对象的本地化字符串表示。const date = new Date(); console.log(date.toLocaleString('zh-CN')); // 输出类似: 2026/3/6 10:00:00 -
valueOf(): 返回对象的原始值。const obj = { value: 10 }; obj.valueOf = function() { return this.value; }; console.log(obj + 5); // 输出: 15(隐式调用valueOf)
三、 已废弃的方法(不推荐使用)
-
__proto__: 访问器属性,用于获取/设置对象的原型(已标准化但建议使用Object.getPrototypeOf()和Object.setPrototypeOf())。const obj = {}; const proto = { x: 1 }; obj.__proto__ = proto; // 不推荐 console.log(obj.__proto__ === proto); // 输出: true -
__defineGetter__()/__defineSetter__(): 定义getter/setter(已废弃,使用Object.defineProperty()代替)。const obj = {}; obj.__defineGetter__('value', () => 42); // 不推荐 console.log(obj.value); // 输出: 42
四、 属性描述符的配置项
当使用Object.defineProperty()等方法时,描述符对象可包含以下属性:
{
value: 42, // 属性值
writable: true, // 是否可修改
enumerable: true, // 是否可枚举(出现在for...in中)
configurable: true, // 是否可删除或修改描述符
// 或使用存取描述符
get: function() { return this._value; },
set: function(newValue) { this._value = newValue; }
}
核心特性提醒:对象方法分为改变原对象和不改变原对象两类。Object.freeze(), Object.seal(), Object.preventExtensions()会改变对象状态,而Object.assign()会修改目标对象。其他大部分方法不改变原对象。