13 Stimmen

wie man auf Javascript-Objektvariablen in der Prototyp-Funktion zugreift

Ich habe das folgende javascript

function person() {
  //private Variable
  var fName = null;
  var lName = null;

  // assign value to private variable
  fName = "Dave";
  lName = "Smith";
};

person.prototype.fullName = function () {
  return this.fName + " " + this.lName;
};

var myPerson = new person();
alert(myPerson.fullName());

Ich versuche, ein Verständnis der objektorientierten Techniken in Javascript zu bekommen. Ich habe eine einfache Person Objekt und fügte eine Funktion zu seinem Prototyp.

Ich hatte erwartet, dass die Meldung "Dave Smith" lauten würde, aber ich bekam "underfined underfined" Warum ist das so und wie kann ich das beheben?

14voto

roberkules Punkte 6459

Leider können Sie nicht auf eine private Variable zugreifen. Also ändern Sie sie entweder in eine öffentliche Eigenschaft oder Sie fügen Getter/Setter-Methoden hinzu.

function person() {

    //private Variable
    var fName = null;
    var lName = null;

    // assign value to private variable
    fName = "Dave";
    lName = "Smith";

    this.setFName = function(value){ fName = value; };
    this.getFName = function(){ return fName; }
};

siehe javascript - Zugriff auf private Mitgliedsvariablen von prototyp-definierten Funktionen


Aber eigentlich sieht es so aus, als ob es das ist, wonach Sie suchen: Javascript privates Mitglied auf Prototyp

aus diesem SO-Beitrag:

Da JavaScript lexikalisch skaliert ist, können Sie dies auf einer Ebene pro Objekt simulieren, indem Sie die Konstruktorfunktion als Schließung über Ihre "privaten Mitglieder" verwenden und Ihre Methoden im Konstruktor definieren, aber dies funktioniert nicht für Methoden, die in der Prototypeigenschaft des Konstruktors definiert sind.

in Ihrem Fall:

var Person = (function() {
    var store = {}, guid = 0;

    function Person () {
        this.__guid = ++guid;
        store[guid] = { 
            fName: "Dave",
            lName: "Smith"
        };
    }

    Person.prototype.fullName = function() {
        var privates = store[this.__guid];
        return privates.fName + " " + privates.lName;
    };

    Person.prototype.destroy = function() {
        delete store[this.__guid];
    };

    return Person; 
})();

var myPerson = new Person();

alert(myPerson.fullName());

// in the end, destroy the instance to avoid a memory leak
myPerson.destroy();

Sehen Sie sich die Live-Demo an unter http://jsfiddle.net/roberkules/xurHU/

5voto

RobG Punkte 133037

Wenn Sie person als Konstruktor aufrufen, wird ein neues Objekt erstellt, als ob Sie new Object() und zugewiesen an seine este Stichwort. Es ist dieses Objekt, das standardmäßig vom Konstruktor zurückgegeben wird.

Wenn Sie also möchten, dass Ihre Instanz Eigenschaften hat, müssen Sie diese zu diesem Objekt hinzufügen:

function Person() {

    // assign to public properties
    this.fName = "Dave";
    this.lName = "Smith";
};

Übrigens: Funktionen, die als Konstruktoren aufgerufen werden sollen, erhalten per Konvention einen Namen, der mit einem Großbuchstaben beginnt.

2voto

Sie deklarieren diese Variablen als lokal in der Funktion, anstatt sie zum Teil des Objekts zu machen. Um sie in die Instanz einzubinden, müssen Sie "this" auch im Konstruktor verwenden. Zum Beispiel:

function person() {
    this.fName = 'Dave';
    this.lName = 'Smith';
}

person.prototype.fullName = function () {
    return this.fName + " " + this.lName;
};

var myPerson = new person();

alert(myPerson.fullName());

0voto

Justin Ethier Punkte 126797

Im Konstruktor sollten Sie Ihre Variablen an this :

    this.fName = null;
    this.lName = null;

Aber dann sind sie nicht privat. JavaScript hat keine privaten Variablen wie eine "klassische" objektorientierte Sprache. Die einzigen "privaten" Variablen sind lokale Variablen. Eine Alternative dazu ist die Zuweisung von Getter/Setter-Methoden an this innerhalb des Konstruktors.

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