首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

ES5 規範核心增強:Object 靜態方法全解析與安全編程實踐

     編輯:Java 綜合教學

ES5 規範核心增強:Object 靜態方法全解析與安全編程實踐

一、屬性描述符核心概念

ES5 引入 屬性描述符 精細控制對象屬性行為,包含四大特性:

特性含義默認值嚴格模式違規
configurable能否 delete / 重新定義描述符falseTypeError
enumerable能否 for-in / Object.keys 枚舉false靜默忽略
writable能否修改值falseTypeError
value屬性值undefined-

存取器描述符 (互斥數據描述符):get/set 函數,無 value/writable

二、核心靜態方法詳解

1. Object.defineProperty(obj, prop, descriptor) - 精準定義單屬性

// 嚴格模式下演示
"use strict";
const person = {};

// 僅定義 value,其餘特性默認 false
Object.defineProperty(person, 'name', { value: 'Scott' });
// person.name = 'John'; // TypeError: Cannot assign to read only property
// delete person.name;   // TypeError: Cannot delete property

// 完全控制:可寫、可枚舉、可配置
Object.defineProperty(person, 'age', {
    value: 25,
    writable: true,
    enumerable: true,
    configurable: true
});
person.age = 26; // 成功
for (let k in person) console.log(k); // 輸出 age (name 不可枚舉)

// 存取器:計算屬性、驗證邏輯
let _age = 20;
Object.defineProperty(person, 'validatedAge', {
    get() { return _age; },
    set(v) { _age = Math.max(0, Math.min(150, v)); } // 限制 0-150
});
person.validatedAge = -1; console.log(person.validatedAge); // 0
person.validatedAge = 200; console.log(person.validatedAge); // 150

2. Object.defineProperties(obj, descriptors) - 批量定義

const person = {};
Object.defineProperties(person, {
    name: { value: 'Scott', writable: false, enumerable: true },
    address: { value: 'Beijing', writable: true, enumerable: true }
});

3. Object.getOwnPropertyDescriptor(obj, prop) - 獲取描述符

const desc = Object.getOwnPropertyDescriptor(person, 'name');
console.log(desc.configurable, desc.writable, desc.enumerable, desc.value);
// false false true 'Scott'

4. Object.create(proto, descriptors) - 原型繼承創建對象

const human = { species: 'Human' };
const person = Object.create(human, {
    name: { value: 'Scott', writable: true, enumerable: true, configurable: false },
    gender: { get() { return 'Male'; } } // 僅 getter,不可寫
});
console.log(person.name); // Scott
console.log(person.gender); // Male
console.log(person.species); // Human (來自原型)
console.log(Object.getPrototypeOf(person) === human); // true

5. Object.getPrototypeOf(obj) - 獲取原型

console.log(Object.getPrototypeOf(person) === human); // true

6. Object.keys(obj) vs Object.getOwnPropertyNames(obj)

const arr = ['a','b','c'];
console.log(Object.keys(arr)); // ['0','1','2']
console.log(Object.getOwnPropertyNames(arr)); // ['0','1','2','length']

const obj = {};
Object.defineProperties(obj, {
    a: { value: 1, enumerable: true },
    b: { value: 2, enumerable: false }
});
console.log(Object.keys(obj)); // ['a']
console.log(Object.getOwnPropertyNames(obj)); // ['a','b']

7. 擴展性控制三部曲

方法效果檢測方法可逆
Object.preventExtensions(obj)禁止添加新屬性Object.isExtensible(obj)不可逆
Object.seal(obj)防擴展 + 所有屬性 configurable=falseObject.isSealed(obj)不可逆
Object.freeze(obj)密封 + 所有屬性 writable=falseObject.isFrozen(obj)不可逆
// 防擴展
const a = { x: 1 };
Object.preventExtensions(a);
a.y = 2; // 嚴格模式 TypeError

// 密封
const b = { x: 1 };
Object.seal(b);
b.x = 2; // 允許修改值
delete b.x; // TypeError
Object.defineProperty(b, 'x', { configurable: true }); // TypeError

// 凍結 (淺凍結)
const c = { x: 1, info: { age: 20 } };
Object.freeze(c);
c.x = 2; // TypeError
c.info.age = 21; // 成功!嵌套對象未凍結
// 深凍結需遞歸
function deepFreeze(obj) {
    Object.freeze(obj);
    Object.keys(obj).forEach(k => {
        if (obj[k] && typeof obj[k] === 'object') deepFreeze(obj[k]);
    });
}

三、嚴格模式配合

所有違規操作在嚴格模式 ("use strict") 下拋出 TypeError,非嚴格模式靜默失敗。強烈建議生產代碼全程啟用嚴格模式。

四、實戰應用場景

  1. 不可變配置對象:Object.freeze(config)
  2. 只讀視圖:Object.defineProperty(obj, 'prop', { get: () => value })
  3. 私有狀態封裝:閉包 + defineProperty 存取器
  4. API 防篡改:Object.seal(module.exports)
  5. 性能優化:configurable: false 允許引擎優化

描述符默認值表 嚴格模式異常 delete異常 writable=true效果 configurable限制 重新定義異常 create原型鏈 keys vs getOwnPropertyNames

ES5 Object 靜態方法奠定了 JavaScript 元編程基石,配合嚴格模式能構建高安全性、高可維護性的代碼庫。理解描述符機制、原型繼承、擴展性控制,是現代 JS 開發者的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved