Я хотел бы сделать структуру объекта неизменной, препятствуя тому, чтобы ее свойства были впоследствии заменены. Свойства должны быть читаемыми, как бы то ни было. Действительно ли это возможно?
Я уверен, что нет никаких функций языка (вроде final
в Java и readonly
в C#) для поддержки это, но задалось вопросом, мог ли быть другой механизм для достижения того же результата?
Я ищу что-то вдоль этих строк:
var o = {
a: "a",
f: function () {
return "b";
}
};
var p = o.a; // OK
o.a = "b"; // Error
var q = o.f(); // OK
o.f = function () { // Error
return "c";
};
В ECMAScript 5 появятся seal()
и freeze()
, но в текущей реализации JavaScript нет хорошего способа сделать это.
Лучшее, что вы можете сделать, - это спрятать свои свойства внутри замыкания.
var getMap = function(){
var hidden = "1";
return {
getHidden : function() { return hidden; }
}
}
var f = getMap ();
alert(f.getHidden());
Я нанёс ему удар. В приведенном выше коде вам нужно будет не просто вернуть скрытый, но, возможно, скопировать его в новый объект. возможно, вы можете использовать расширение jquery, чтобы сделать это за вас, поэтому вы вернете новый объект, а не ссылку. Хотя это может быть совершенно неверно =)
Использование var
в конструкторе объекта создаст приватную переменную. По сути, это закрытие. Затем вы можете создать публичную функцию для доступа к ней/изменения. Дополнительная информация и примеры доступны в Private Members in Javascript Дугласа Крокфорда.
Как сказал mkoryak, вы можете создать закрытие, чтобы скрыть свойства
function Car(make, model, color) {
var _make = make, _model = model, _color = color;
this.getMake = function() {
return _make;
}
}
var mycar = new Car("ford", "mustang", "black");
mycar.getMake(); //returns "ford"
mycar._make; //error