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"?
3 odpowiedzi
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.
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"?
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.