在 JavaScript 中,Object
是一个内置对象,它提供了一些静态方法和属性,用于操作和处理对象。以下是一些常见的 Object
方法:
1. 创建和复制对象
-
Object.create(proto, [propertiesObject])
- 创建一个新对象,并指定其原型(
proto
)。 - 可选的第二个参数可以定义对象的属性。
const proto = { name: "Alice" }; const obj = Object.create(proto); console.log(obj.name); // "Alice"(继承自原型)
- 创建一个新对象,并指定其原型(
-
Object.assign(target, ...sources)
- 将多个源对象的属性复制到目标对象中(浅拷贝)。
const obj1 = { a: 1 }; const obj2 = { b: 2 }; const result = Object.assign({}, obj1, obj2); console.log(result); // { a: 1, b: 2 }
-
Object.defineProperties(obj, props)
- 在对象上定义多个属性,并可以设置它们的特性(如可枚举、可配置等)。
const obj = {}; Object.defineProperties(obj, { a: { value: 1, writable: true, enumerable: true }, b: { value: 2, writable: false, enumerable: false } }); console.log(obj); // { a: 1 }
-
Object.defineProperty(obj, prop, descriptor)
- 定义或修改对象的单个属性。
const obj = { a: 1 }; Object.defineProperty(obj, "b", { value: 2, writable: false, enumerable: true, configurable: true }); console.log(obj); // { a: 1, b: 2 }
2. 获取对象信息
-
Object.keys(obj)
- 返回对象自身可枚举属性的键名数组。
const obj = { a: 1, b: 2 }; console.log(Object.keys(obj)); // ["a", "b"]
-
Object.values(obj)
- 返回对象自身可枚举属性的键值数组。
const obj = { a: 1, b: 2 }; console.log(Object.values(obj)); // [1, 2]
-
Object.entries(obj)
- 返回对象自身可枚举属性的键值对数组。
const obj = { a: 1, b: 2 }; console.log(Object.entries(obj)); // [["a", 1], ["b", 2]]
-
Object.getOwnPropertyNames(obj)
- 返回对象自身所有属性的键名(包括不可枚举属性)。
const obj = { a: 1 }; Object.defineProperty(obj, "b", { value: 2, enumerable: false }); console.log(Object.getOwnPropertyNames(obj)); // ["a", "b"]
-
Object.getOwnPropertyDescriptor(obj, prop)
- 获取对象某个属性的描述符。
const obj = { a: 1 }; const descriptor = Object.getOwnPropertyDescriptor(obj, "a"); console.log(descriptor); // { value: 1, writable: true, enumerable: true, configurable: true }
3. 检查对象
-
Object.hasOwnProperty(prop)
- 检查对象自身是否拥有某个属性(不检查原型链)。
const obj = { a: 1 }; console.log(obj.hasOwnProperty("a")); // true console.log(obj.hasOwnProperty("toString")); // false
-
Object.is(value1, value2)
- 比较两个值是否严格相等(与
===
类似,但更严格)。
console.log(Object.is(0, -0)); // false console.log(0 === -0); // true
- 比较两个值是否严格相等(与
-
Object.isExtensible(obj)
- 检查对象是否可扩展(是否可以添加新属性)。
const obj = {}; console.log(Object.isExtensible(obj)); // true Object.preventExtensions(obj); console.log(Object.isExtensible(obj)); // false
-
Object.isFrozen(obj)
- 检查对象是否被冻结(不可修改属性值、不可添加或删除属性)。
const obj = { a: 1 }; Object.freeze(obj); console.log(Object.isFrozen(obj)); // true
-
Object.isSealed(obj)
- 检查对象是否被密封(不可添加或删除属性,但可以修改属性值)。
const obj = { a: 1 }; Object.seal(obj); console.log(Object.isSealed(obj)); // true
4. 修改对象
-
Object.preventExtensions(obj)
- 防止对象添加新属性。
const obj = { a: 1 }; Object.preventExtensions(obj); obj.b = 2; console.log(obj); // { a: 1 }
-
Object.freeze(obj)
- 冻结对象,使其不可修改(不可添加、删除或修改属性)。
const obj = { a: 1 }; Object.freeze(obj); obj.a = 2; console.log(obj); // { a: 1 }
-
Object.seal(obj)
- 密封对象,使其不可添加或删除属性,但可以修改属性值。
const obj = { a: 1 }; Object.seal(obj); obj.a = 2; console.log(obj); // { a: 2 }
5. 其他方法
-
Object.prototype.toString.call(value)
- 获取值的类型(比
typeof
更精确)。
console.log(Object.prototype.toString.call(123)); // "[object Number]" console.log(Object.prototype.toString.call([1, 2, 3])); // "[object Array]"
- 获取值的类型(比
-
Object.getPrototypeOf(obj)
- 获取对象的原型。
const obj = {}; console.log(Object.getPrototypeOf(obj)); // Object.prototype
-
Object.setPrototypeOf(obj, prototype)
- 设置对象的原型。
const proto = { name: "Alice" }; const obj = {}; Object.setPrototypeOf(obj, proto); console.log(obj.name); // "Alice"
总结
Object
提供了丰富的方法,用于创建、操作、检查和修改对象。这些方法在日常开发中非常有用,尤其是在处理复杂的对象结构时。掌握这些方法可以帮助你更高效地编写和调试 JavaScript 代码。