2017-03-07 108 views
0

我想在JavaScript中創建一個封閉的對象,只能使用Object.defineProperty進行編輯,而不是正常的方式來編輯它...Javascript對象編輯部分

的目標是,我創建一個lib,用戶可以在其中讀取一個名爲字典的對象,但他們也可以編輯它!有什麼辦法可以讓用戶閱讀並由我編輯的對象?

+2

在JS中,你無法在運行時保護任何東西。一切都可以猴子修補。 – zerkms

+0

@zerkms我已經添加了一個答案,請檢查它並告訴我什麼是錯的! – challenger

回答

0

可以使用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。

這是很方便的,以確保性能只能得到「有效」的價值觀和我經常使用這種方式。

0

我找到了!請告訴我這個解決方案有什麼問題:

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) 
+0

@zerkms檢查這個答案! – challenger

+0

@edi檢查此答案! – challenger

+0

這只是對一個名爲'getter'和'setter'的屬性進行一些保護。我不明白這對你有什麼幫助。 – rasmeister