我想在JavaScript中創建一個封閉的對象,只能使用Object.defineProperty進行編輯,而不是正常的方式來編輯它...Javascript對象編輯部分
的目標是,我創建一個lib,用戶可以在其中讀取一個名爲字典的對象,但他們也可以編輯它!有什麼辦法可以讓用戶閱讀並由我編輯的對象?
我想在JavaScript中創建一個封閉的對象,只能使用Object.defineProperty進行編輯,而不是正常的方式來編輯它...Javascript對象編輯部分
的目標是,我創建一個lib,用戶可以在其中讀取一個名爲字典的對象,但他們也可以編輯它!有什麼辦法可以讓用戶閱讀並由我編輯的對象?
這是不能夠保護任何物體的部件。
可以使用Object.defineProperty這樣提供一些基本的保護:
var o = { a: 5 };
o._protected = {};
o._protected.a = o.a;
Object.defineProperty(o, 'a', {
get: function() { return this._protected.a; },
set: function(value) {
if (value > 0 && value < 5) {
this._protected.a = value;
}
configurable: false
});
這將在這個對象限制更改物業a
所以他們會通過get (讀取)/設置(更新)。當然,在這種情況下,_protected
對象可以被操縱,但它確實需要用戶有意識地「破解」它。嘗試直接更改屬性a
將在您的控制之下。
在這個例子中,設置o.a = 6的嘗試不會導致o.a發生變化(當然,如果可以的話,您可以將它設置爲set函數中允許的最大值)。
您可以防止通過變更不提供一套功能o.a。
這是很方便的,以確保性能只能得到「有效」的價值觀和我經常使用這種方式。
我找到了!請告訴我這個解決方案有什麼問題:
var protected = {}
Object.defineProperty(this,
'setter', {
value: function(name , value) {
protected[name] = value
},
writable: false,
})
Object.defineProperty(this,
'getter', {
value: function(name , value) {
return JSON.parse(JSON.stringify(protected))
},
writable: false,
})
Object.freeze(this.setter)
Object.freeze(this.getter)
@zerkms檢查這個答案! – challenger
@edi檢查此答案! – challenger
這只是對一個名爲'getter'和'setter'的屬性進行一些保護。我不明白這對你有什麼幫助。 – rasmeister
在JS中,你無法在運行時保護任何東西。一切都可以猴子修補。 – zerkms
@zerkms我已經添加了一個答案,請檢查它並告訴我什麼是錯的! – challenger