在JavaScript中,Object() 是一個基礎構造函數,用于創建對象或轉換值為對象類型。它既是語言的核心組成部分,也提供了一系列靜態方法用于對象操作。以下是詳細解析和應用示例:
一、Object() 的基本行為
- 作為構造函數(使用 new 調用):
- 創建空對象:const obj = new Object() 等價于字面量 {}。
- 若傳入值,則根據類型轉換:
- 對象 → 直接返回原對象(不創建新對象)。
- null/undefined → 返回空對象 {}。
- 原始值(數字、字符串、布爾) → 返回對應的包裝對象(如 new Number(1))。
console.log(new Object(123)); // [Number: 123]
console.log(new Object("hello")); // [String: 'hello']
console.log(new Object(true)); // [Boolean: true]
- 作為普通函數(不使用 new):
- 行為與 new Object() 完全一致。
二、核心應用場景
- 類型轉換:將值轉為對象
const numObj = Object(42); // 等價于 new Number(42)
console.log(typeof numObj); // "object"
- 創建空對象
const obj = Object(); // 等同于 {} 或 new Object()
obj.key = "value";
console.log(obj); // { key: 'value' }
- 復制對象(淺拷貝)
const original = { a: 1, b: { c: 2 } };
const copy = Object(original); // 直接返回原對象
console.log(copy === original); // true(同一引用)
三、Object 的靜態方法(關鍵工具)
- 屬性操作
- Object.keys(obj):獲取對象自身可枚舉屬性的鍵數組。
const user = { name: "Alice", age: 30 };
console.log(Object.keys(user)); // ["name", "age"]
- Object.values(obj):獲取對象自身可枚舉屬性的值數組。
console.log(Object.values(user)); // ["Alice", 30]
- Object.entries(obj):獲取鍵值對數組。
console.log(Object.entries(user)); // [["name", "Alice"], ["age", 30]]
- 對象合并
- Object.assign(target, …sources):
將源對象的屬性合并到目標對象(淺拷貝)。
const target = { a: 1 };
const source = { b: 2 };
Object.assign(target, source);
console.log(target); // { a: 1, b: 2 }
- 原型與對象創建
- Object.create(proto):
以指定原型創建新對象。
const parent = { greet: () => "Hello!" };
const child = Object.create(parent);
console.log(child.greet()); // "Hello!"
- 屬性定義
- Object.defineProperty(obj, prop, descriptor):
精確控制屬性行為(如是否可寫、可枚舉)。
const obj = {};
Object.defineProperty(obj, "readOnly", {value: 100,writable: false,
});
obj.readOnly = 200; // 靜默失敗(嚴格模式報錯)
console.log(obj.readOnly); // 100
- 對象保護
- Object.freeze(obj):
凍結對象,禁止修改(添加/刪除/修改屬性)。
const frozen = Object.freeze({ value: 42 });
frozen.value = 100; // 無效(嚴格模式報錯)
- Object.seal(obj):
禁止添加/刪除屬性,但允許修改現有屬性。
四、注意事項
- 原始值包裝對象:
Object(123) 會創建 Number 包裝對象,而非原始值。優先使用原始值避免意外行為。 - 深拷貝問題:
Object.assign() 是淺拷貝。深拷貝需使用 JSON.parse(JSON.stringify(obj)) 或工具庫(如 Lodash)。 - 性能:
字面量 {} 比 new Object() 更高效,推薦使用字面量。
五、應用總結
場景 | 推薦方法 |
---|---|
創建空對象 | {}(字面量) |
合并對象 | Object.assign() 或擴展運算符 … |
獲取鍵/值/鍵值對 | Object.keys()/values()/entries() |
保護對象 | Object.freeze()/seal() |
精確控制屬性 | Object.defineProperty() |