2017-03-07 3 views
0

bearbeitet ich ein geschlossenes Objekt in Javascript erstellen wollen, die nur Object.defineProperty mit bearbeitet werden können und nicht in gewohnter Weise bearbeitet werden ...Javascript-Objekt teilweise

Das Ziel ist es, ich schaffe Eine Lib, in der Benutzer ein Objekt namens Dictionary lesen können, aber sie können es auch bearbeiten! Gibt es eine Möglichkeit, ein Objekt zu haben, das von Benutzern gelesen und von mir bearbeitet werden kann?

+2

In JS können Sie nichts in Runtime schützen. Alles kann Affenflicken sein. – zerkms

+0

@zerkms Ich habe eine Antwort hinzugefügt, bitte überprüfen Sie und sagen Sie mir, was los ist! – challenger

Antwort

0

Sie können einige grundlegende Schutz bieten wie diese mit 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 
}); 

Diese Änderungen Eigenschaft a in diesem Objekt beschränken wird, so dass sie durch die get gehen (lesen)/setzen (aktualisieren). Natürlich kann in diesem Fall das _protected Objekt manipuliert werden, aber es erfordert, dass der Benutzer es bewusst "hackt". Versuche, Eigenschaft a direkt zu ändern, würden unter Ihrer Kontrolle sein.

In diesem Beispiel würde ein Versuch, o.a = 6 zu setzen, keine Änderung von o.a zur Folge haben (natürlich könnten Sie ihn auf den maximal erlaubten Wert in Ihrer set-Funktion setzen, wenn dies vorzuziehen wäre).

Sie können Änderungen an o.a verhindern, indem Sie keine Set-Funktion bereitstellen.

Dies kann nützlich sein, um sicherzustellen, dass Eigenschaften nur 'gültige' Werte erhalten und ich habe es oft so verwendet.

0

Ich habe es gefunden! Bitte sagen Sie mir, was ist los mit dieser Lösung:

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 überprüfen Sie diese Antwort! – challenger

+0

@edi überprüfen Sie diese Antwort! – challenger

+0

Dies ist einfach Schutz auf eine Eigenschaft namens "Getter" und "Setter". Ich sehe nicht, wie dir das hilft. – rasmeister