564 Stimmen

Private Eigenschaften in JavaScript ES6 Klassen

Ist es möglich, private Eigenschaften in ES6-Klassen zu erstellen?

Hier ist ein Beispiel. Wie kann ich den Zugriff auf instance.property verhindern?

class Something {
  constructor(){
    this.property = "test";
  }
}

var instance = new Something();
console.log(instance.property); //=> "test"

3voto

Ilya Zarembsky Punkte 151
klasse Etwas {
  constructor(){
    var _eigenschaft = "test";
    Object.defineProperty(this, "eigenschaft", {
        get: function(){ return _eigenschaft}
    });
  }
}

var instanz = new Etwas();
console.log(instanz.eigenschaft); //=> "test"
instanz.eigenschaft = "kann von außen lesen, aber nicht schreiben";
console.log(instanz.eigenschaft); //=> "test"

3voto

Jayesbe Punkte 103

Ein weiterer Weg, ähnlich wie die letzten beiden geposteten

class Beispiel {
  constructor(foo) {

    // private
    const self = this;
    this.foo = foo;

    // öffentliche Schnittstelle
    return self.public;
  }

  public = {
    // leere Daten
    nodata: { data: [] },
    // noop
    noop: () => {},
  }

  // alles andere privat
  bar = 10
}

const test = new Beispiel('FOO');
console.log(test.foo); // undefined
console.log(test.noop); // { data: [] }
console.log(test.bar); // undefined

2voto

Yami Teru Punkte 29

Ich benutze dieses Muster und es hat immer für mich funktioniert

class Test {
    constructor(data) {
        class Public {
            constructor(prv) {

                // öffentliche Funktion (muss im Konstruktor sein, um auf die Variable "prv" zugreifen zu können)
                connectToDb(ip) {
                    prv._db(ip, prv._err);
                } 
            }

            // öffentliche Funktion ohne Zugriff auf die Variable "prv"
            log() {
                console.log("Ich protokolliere");
            }
        }

        // private Variablen
        this._data = data;
        this._err = function(ip) {
            console.log("konnte keine Verbindung zu "+ip+" herstellen");
        }
    }

    // private Funktion
    _db(ip, err) {
        if(!!ip) {
            console.log("Verbindung zu "+ip+" hergestellt, sende Daten '"+this.data+"'");
            return true;
        }
        else err(ip);
    }
}

var test = new Test(10),
        ip = "185.167.210.49";
test.connectToDb(ip); // true
test.log(); // Ich protokolliere
test._err(ip); // undefined
test._db(ip, function() { console.log("Sie wurden gehackt!"); }); // undefined

2voto

Paweł Punkte 3662

Eigentlich ist es möglich.
1. Erstelle die Klasse und gib im Konstruktor die aufgerufene _public-Funktion zurück.
2. Übergib im aufgerufenen _public-Funktion den this-Verweis (um Zugriff auf alle privaten Methoden und Eigenschaften zu erhalten) und alle Argumente aus dem Konstruktor (die im new Names() übergeben werden)
3. Im Bereich der _public-Funktion gibt es auch die Names-Klasse mit Zugriff auf den this (_this)-Verweis der privaten Names-Klasse

class Names {
  constructor() {
    this.privateProperty = 'John';
    return _public(this, arguments);
  }
  privateMethod() { }
}

const names = new Names(1,2,3);
console.log(names.somePublicMethod); //[Function]
console.log(names.publicProperty); //'Jasmine'
console.log(names.privateMethod); //undefined
console.log(names.privateProperty); //undefind

function _public(_this, _arguments) {
  class Names {
    constructor() {
      this.publicProperty = 'Jasmine';
      _this.privateProperty; //"John";
      _this.privateMethod; //[Function]
    }

    somePublicMethod() {
      _this.privateProperty; //"John";
      _this.privateMethod; //[Function]
    }

  }
  return new Names(..._arguments);
}

2voto

João Henrique Punkte 31

Sie können dies https://www.npmjs.com/package/private-members ausprobieren

Dieses Paket speichert die Member nach Instanz.

const pvt = require('private-members');
const _ = pvt();

let Exemplo = (function () {    
    function Exemplo() {
        _(this).msg = "Meine Nachricht";
    }

    _().nachricht = function() {
        return _(this).msg;
    }

    Exemplo.prototype.showMsg = function () {
        let msg = _(this).nachricht();
        console.log(msg);
    };

    return Exemplo;
})();

module.exports = Exemplo;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X