var book = {};
Object.defineProperties(book, {
_year: { value: 2004 }, // 默認 writable: false
edition: { value: 1 }, // 默認 writable: false
year: {
get: function() { return this._year; },
set: function(newValue) {
if (newValue > 2004) {
this._year = newValue; // 嚴格模式下拋 TypeError
this.edition += newValue - 2004;
}
}
}
});
book.year = 2015;
console.log(book.year); // 2004 (未修改)
console.log(book.edition); // 1 (未修改)
Object.defineProperties 定義的數據屬性默認特性:
writable: false —— 不能賦值修改enumerable: false —— for...in 不枚舉configurable: false —— 不能刪除/重新定義Setter 內部 this._year = newValue 試圖寫入 writable: false 的屬性,嚴格模式下拋異常,非嚴格模式靜默失敗。
Object.defineProperties(book, {
_year: { value: 2004, writable: true }, // 關鍵:允許寫入
edition: { value: 1, writable: true }, // 關鍵:允許寫入
year: {
get: function() { return this._year; },
set: function(newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
Object.defineProperty(book, '_year', { value: 2004, writable: true });
Object.defineProperty(book, 'edition', { value: 1, writable: true });
class Book {
#_year = 2004; // 真正私有,外部不可訪問
#edition = 1;
get year() { return this.#_year; }
set year(v) {
if (v > 2004) {
this.#_year = v;
this.#edition += v - 2004;
}
}
}
writable: true。writable 影響,但內部操作的數據屬性需可寫。class + #private,語義清晰、原生私有、無需 defineProperty 样板代碼。