Próbując dowiedzieć się, jak utworzyć trwały obiekt z JavaScript, ale jak widać z poniższego przykładu, można łatwo uzyskać dostęp do wszystkich członków instancji - co robię źle?

function Person(name, age, job){
    "use strict";

    //create the object to return
    var o = new Object();

    //optional: define private variables/functions here
    o.name  = name;
    o.age   = age;
    o.job   = job;

    //attach methods
    o.sayName = function(){
        alert(name);
    };    

    //return the object
    return o;
}

var newGuy = Person("Guy", 21, "Seeker");

newGuy.name; // "Guy" <- Shouldn't this return an error or "undefined"?
0
user1809836 16 sierpień 2014, 22:41

3 odpowiedzi

Najlepsza odpowiedź

Dostajesz "Guy", ponieważ ustawisz go jako name właściwość o, a następnie powrócić o na zewnątrz, dzięki czemu publicznie, udostępniając go publicznie.

Jeśli chcesz zmiennych prywatnych, możesz użyć

function Person(name, age, job){
    "use strict";
    // name, age, job are private variables
    // sayName is a privileged method
    this.sayName = function(){
        alert(name);
    };
}
var newGuy = new Person("Guy", 21, "Seeker");
newGuy.name; // undefined

Uwaga Nie musisz tworzyć nowego obiektu o i zwróć go, po prostu zadzwoń do konstruktora za pomocą operatora new i przypisz właściwości publiczne / uprzywilejowane do this.

Proponuję czytać Prywatni członkowie w JavaScript, przez Douglas Crockford.

2
Oriol 16 sierpień 2014, 18:45

Istnieje wiele różnych sposobów tworzenia właściwości prywatnych. Wszyscy znajdują sposoby, aby skorzystać z faktu, że zmienne są zasłonięte lokalnie w funkcje, ale mogą być przechwytywane w funkcjach.

Na przykład, zamiast powrócić o, co będzie miał wszystkie odsłonięte właściwości, możesz zwrócić inny obiekt, który ma prywatny dostęp. W tym fragmencie jest trochę redundancji, ale chciałem utrzymać go blisko twojego przykładu:

function person(name, age, job){
     "use strict";
    //optional: define private variables/functions here
    var name  = name;
    var age   = age;
    var job   = job;

   //return the object that uses variable, that are only visible within the function
   return {
        sayName: function(){
                    alert(name);
                    },
        sayJob: function(){
                    alert(job);
                    }
   }
}

var newGuy = person("Guy", 21, "Seeker");

newGuy.sayName();   
newGuy.sayJob();   
alert("undefined: ", newGuy.name); // "Guy" <- Shouldn't this return an error or "undefined"?
1
Mark M 16 sierpień 2014, 19:01

W przypadku trwałego obiektu Douglas Crockford zaleca unikanie całkowitego "tego" i "nowego". W ten sposób pójdziesz na osiągnięcie tego, co chcesz:

var person = function (vals) {
    var that = {}; // create object to avoid constructing with "new" and using "this"

    that.sayName = function () { // bind accessor functions
        return vals.name; // use passed values to ensure privacy
    };

    return that;
};

var guy = person({name: "Guy"}); // avoided use of "new"
alert(guy.name); // undefined as should be
guy.sayName(); // "Guy"

Możesz znaleźć więcej informacji w swojej książce: JavaScript: Dobre części na stronie 52. Mam nadzieję, że to pomoże.

1
Jeffrey Kenneth Berhow 27 czerwiec 2015, 06:11