Frage

Ich habe eine JavaScript -Klasse wie SO:

var Welcomer = function(name) {
  var pName = name;
  var pMessage = function() {
    return "Hi, " + pName + "!";
  };

  return {
    sayHi: function() {
      alert(pMessage());
    }
  };
};

new Welcomer('Sue').sayHi();

Gibt es eine Möglichkeit zu "Unterklasse" Welcomer So kann ich die öffentlichen Methoden neu definieren und Zugang zu den privaten Methoden und Variablen haben? Das Folgende gibt mir Zugang zu den öffentlichen Methoden, aber nicht zu den privaten:

var UnhappyWelcomer = function(name) {
  var pSadMessage = function() {
    // won't work, b/c I don't have access to pMessage
    return pMessage() + " Miserable day, innit?";
  };

  return {
    sayHi: function() {
      alert(pSadMessage());
    }
  };
};
UnhappyWelcomer.prototype = Welcomer(); // failed attempt at inheritance

new UnhappyWelcomer().sayHi();
War es hilfreich?

Lösung

Die einfache Antwort auf Ihre Frage ist Nein.

Sie können nichts tun, um Zugriff auf diese zu erhalten var Definierte Dinge, es sei denn, Ihre Funktion befindet this).

Wenn Sie Zugriff auf die ursprüngliche Funktion haben, können Sie die Dinge so umschreiben, dass diese Funktionen in eine erweiterte Funktion "übergeben" werden könnten, die den "geschützten" Bereich des Objekts verändern kann. Der folgende Code sollte eine gute Vorstellung davon geben, was ich vorschlage.

var Welcomer = function(name) {
  var _protected = {
    name: name,
    message: function() {
      return "Hi, " + _protected.name + "!";
    }
  };

  return {
    extendWith: function(extender) {
      extender.call(this, _protected);
      return this;
    },
    sayHi: function() {
      alert(_protected.message());
    }
  };
};

var UnhappyWelcomer = function(name) {
  var self = Welcomer(name).extendWith(function(_protected) {
    _protected.sadMessage = function() {
       return _protected.message() + " Miserable day, innit?";
    };
    // extending the public while still having scope to _protected...
    this.sayHi = function() {
      alert(_protected.sadMessage());
    };
  });
  return self;
};

UnhappyWelcomer('bob').sayHi();

Andere Tipps

Dieses "Klassen" -Muster ist kein "Klassen" -Muster, es ist als ein bekannt als ein Modulmuster. Es gibt ein Objekt zurück, das keine Verbindungen zu der Funktion hat, die es andere als die Verfügbarkeit seiner privaten Variablen erstellt hat. Das zurückgegebene Objekt ist keine Instanz der Funktion, die es erstellt hat.

Wenn Sie 'New Class ()' nennen, erstellt es eine Instanz dieser Funktion, gibt aber auch ein anderes Objekt zurück. Alle weiteren Operationen sind tatsächlich auf dem zurückgegebenen Objekt und nicht auf der Instanz.

Um die Vererbung zu verwenden, müssen Sie wirklich die prototypische Vererbung ordnungsgemäß verwenden. Ich schlage vor, Sie lesen:

Weitere Lesung:

Es tut mir leid, dass Sie Ihnen Lesenmaterial verlassen, aber es scheint mir, dass Sie Möglichkeiten erforschen. Diese Artikel geben einen tieferen Einblick in die Angelegenheit.

Sobald Sie mehr über die Angelegenheit wissen, werden Sie höchstwahrscheinlich private Mitglieder, die allummordig sind, ignorieren und das Präfix verwenden und es einfach zu einem öffentlichen Mitglied wie allen anderen machen;) Es ist einfach einfacher und private Mitglieder sind sowieso sinnlos.

Wenn Sie wirklich Vererbung benötigen, gibt es einige Bibliotheken, die immens helfen. Eine Option ist Merkmal.js, was möglicherweise irgendwann irgendwann zu einem Standardbestandteil von JavaScript werden kann. Wenn das nicht Ihr Boot schwimmt, haben Bibliotheken wie JQuery und Prototype Helfer für die Erbe.

Wenn Sie einen minimalen/from-Scratch-Ansatz verfolgen möchten, empfehle ich dringend, das Prototypmodell für alles zu verwenden. Sie werden eine große Leistungssteigerung gegenüber dem Muster sehen, das Sie in Ihren Beispielen haben.

Um Ihre Frage direkter zu beantworten, nein. Sie werden es einfacher haben, wenn Sie Ihre "Kurse" entwerfen, sodass private Funktionen nicht auf die Stütze gestellt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top