Там какой-либо путь состоит в том, чтобы предотвратить замену свойств объектов JavaScript?

Я хотел бы сделать структуру объекта неизменной, препятствуя тому, чтобы ее свойства были впоследствии заменены. Свойства должны быть читаемыми, как бы то ни было. Действительно ли это возможно?

Я уверен, что нет никаких функций языка (вроде 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"; 
};
12
задан rightfold 13 March 2015 в 09:16
поделиться

4 ответа

В ECMAScript 5 появятся seal() и freeze(), но в текущей реализации JavaScript нет хорошего способа сделать это.

Источник.

14
ответ дан 2 December 2019 в 03:53
поделиться

Лучшее, что вы можете сделать, - это спрятать свои свойства внутри замыкания.

var getMap = function(){
  var hidden = "1";
  return {
    getHidden : function() { return hidden; }
  }
}

var f = getMap ();

alert(f.getHidden());

Я нанёс ему удар. В приведенном выше коде вам нужно будет не просто вернуть скрытый, но, возможно, скопировать его в новый объект. возможно, вы можете использовать расширение jquery, чтобы сделать это за вас, поэтому вы вернете новый объект, а не ссылку. Хотя это может быть совершенно неверно =)

9
ответ дан 2 December 2019 в 03:53
поделиться

Использование var в конструкторе объекта создаст приватную переменную. По сути, это закрытие. Затем вы можете создать публичную функцию для доступа к ней/изменения. Дополнительная информация и примеры доступны в Private Members in Javascript Дугласа Крокфорда.

5
ответ дан 2 December 2019 в 03:53
поделиться

Как сказал 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
4
ответ дан 2 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: