2016-04-28 14 views
2

Ich versuche, ein Objekt privat zu machen, aber nicht sicher, wie das geht. Wie Sie sehen können, ist die Namensvariable privat. Ich kann sie nicht bearbeiten, aber wenn es zu dem Objekt kommt, das ich zurückgebe, kann ich es bearbeiten. Ich möchte das nicht möglich sein. Ich bin neu in objektorientierten und privaten Methoden in Javascript, also könnte mir jemand sagen, was hier richtig und falsch ist. :) Wie kann ich das lösen? Danke!Warum ist mein Objekt nicht privat, wenn meine Variable ist?

var User = function() { 

    var name = 'bob'; 
    this.getName = function() { 
    return name; 
    } 

    var otherInfo = { 
    age: 20, 
    human: true, 
    } 
    this.getOther = function() { 
    return otherInfo; 
    } 

} 

var person = new User(); 

var name = person.getName(); 
name = 'jenny'; 
console.log(person.getName()); // bob 

var other = person.getOther(); 
other.age = 'wtf?'; 
console.log(person.getOther()); // { age: 'wtf?', human: true } 
+0

Wenn Sie den Rückgabewert von 'person.getOther()' nicht ändern möchten, um den Wert von 'otherInfo' zu ändern, müssen Sie eine Kopie davon zurückgeben. – forgivenson

+0

Wie mache ich das? –

+0

http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object – Jonathan

Antwort

0

Es ist passiert, weil in JS-Objekt durch Link passiert - es gibt nicht aus dem Quellobjekt.

versuchen einfach kopieren Objekt:

var User = function() { 

    var name = 'bob'; 
    this.getName = function() { 
    return name; 
    } 

    var otherInfo = { 
    age: 20, 
    human: true, 
    } 
    this.getOther = function() { 
    return Object.assign({}, otherInfo); 
    } 

} 

var person = new User(); 

var name = person.getName(); 
name = 'jenny'; 
console.log(person.getName()); // bob 

var other = person.getOther(); 
other.age = 'wtf?'; 
console.log(person.getOther()); // { age: 20, human: true } 
+0

Dies kopiert das Objekt nicht wirklich. Stattdessen verwendet es 'this.otherInfo' als Prototyp für das neue Objekt. – forgivenson

+0

ok. es war vary schnelle antwort. Ich habe es in Object.assign geändert. –

+0

Ihr Code funktioniert immer noch nicht. Probieren Sie es aus. – forgivenson

1

Primitive Werte wie Strings von Wert geben werden. Das heißt, wenn Sie Ihrer Variablen einen String zuweisen, setzen Sie den tatsächlichen Wert des Strings auf die Variable.

Objekte sind bestanden durch Bezugnahme. Das heißt, wenn Sie Ihrer Variablen ein Objekt zuweisen, erstellen Sie einfach eine Referenz auf das Objekt, nicht seinen tatsächlichen Wert. Wenn Sie ein Objekt hätten und es 6 verschiedenen Variablen zuweisen würden, hätte jede Variable eine Referenz für dasselbe zugrunde liegende Objekt.

In Ihrem Beispiel Ihre getOther Methode wird eine Referenz zum otherInfo Objekt zurück. Wenn Sie also die Eigenschaft age auf "wtf" setzen, legen Sie sie auf das Objekt fest, auf das sich Ihre Variable bezieht.

0

Sie deklarieren auch zweimal var name.

Wenn Sie var person = new User(); ist eine var name im Rahmen der Benutzerfunktion deklariert.

Wenn Sie var name = person.getName();, deklarieren Sie eine Variable mit demselben Namen außerhalb des Bereichs der Benutzerfunktion.

Also, wenn Sie name = 'Jenny'; der Interpreter verbindet diese Zeichenfolge die name Variable außerhalb des Bereichs des Benutzers.

Im Allgemeinen ist es eine schlechte Idee, solche Variablen mit allgemeinen Namen (Name, Titel, ID, ...) als globale Variablen zu verwenden. Ich würde auf die Objektattribute mit this. verweisen und setters sowie getters definieren. Sie können auch die setters ignorieren und beziehen sich auf die Benutzer mit person. Attribute wie folgt aus:

function User() { 
    this.name = 'bob'; 
    this.getName = function() { 
    return this.name; 
    } 

    this.otherInfo = { 
    age: 20, 
    human: true, 
    } 
    this.getOther = function() { 
    return this.otherInfo; 
    } 

} 

var person = new User(); 

console.log(person.getName()); // bob 
person.name = 'jenny'; 
console.log(person.getName()); // jenny 

console.log(person.getOther(); // { age: 20, human: true } 
person.otherInfo.age = 'wtf?'; 
console.log(person.getOther()); // { age: 'wtf?', human: true } 
0

Sie haben keine „private“ Dinge im Objekt Umfang in Javascript. Die einzige Möglichkeit, Dinge von außen zu verstecken, ist mit einem Funktionsumfang, wie Sie es mit name gemacht haben (eine lokale Variable in der Funktion User).

Wenn Sie jedes Mal ein Objekt mit demselben Inhalt zurückgeben möchten, können Sie das Objekt in die Funktion einfügen.Wie dies zum Beispiel:

this.getOther = function() { 
    var otherInfo = { 
     age: 20, 
     human: true, 
    } 
    return otherInfo; 
} 

Oder einfach:

this.getOther = function() { 
    return { 
     age: 20, 
     human: true, 
    }; 
} 

In beiden Fällen werden Sie ein neues Objekt mit jedem Aufruf erschaffen.

Verwandte Themen