Как вы можете сделать переменную/объект только для чтения в Javascript?

Возможный дубликат:
может Свойства только для чтения будут реализованы в чистом JavaScript?

У меня есть объект, который я хочу определить только при построении. Как я могу предотвратить изменение ссылки на объект?


person qodeninja    schedule 11.03.2010    source источник
comment
stackoverflow .com/questions/366047/   -  person spender    schedule 11.03.2010


Ответы (2)


EDIT: это было написано 10 лет назад. Я не считаю этот ответ актуальным.

Реально... не перезаписывая его. Вы всегда можете контролировать доступ, обернув его в объект, который предлагает только GetObj без SetObj, но, конечно, оболочка в равной степени подвержена перезаписи, как и ее частные свойства-члены, которые будут скрыты с помощью метода GetObj.

На самом деле вопрос тупой:

Можно ли реализовать свойства только для чтения в чистом JavaScript?

РЕДАКТИРОВАТЬ:

После прочтения http://javascript.crockford.com/private.html можно используйте закрытие для создания ссылок на переменные, которые действительно недоступны из внешнего мира. Например:

function objectHider(obj)
{
    this.getObject=function(){return obj;}
}

var someData={apples:5,oranges:4}

var hider=new objectHider(someData);

//... hider.getObject()

где ссылка на obj в objectHider не может быть изменена после создания объекта.

Я пытаюсь придумать практическое применение для этого.

person spender    schedule 11.03.2010
comment
На самом деле hider.getObject просто возвращает ссылку на объект someData, и его можно изменить, например: hider.getObject().apples = 0;, тогда hider.getObject(); вернет тот же измененный объект, так как hider.getObject() == someData... - person Christian C. Salvadó; 12.03.2010
comment
Конечно, но это один и тот же объект. Я только утверждал, что ссылка на него неизменна, а не его свойства. Теперь, если некоторые данные также внедрили технологию скрытия...? - person spender; 12.03.2010
comment
Вам нужно будет создать глубокую копию объекта, чтобы он работал. Для этого можно использовать расширение jQuery: function (obj) { return $.extend({}, obj); } - person crush; 03.04.2015

В текущей широко доступной реализации ECMAScript 3 нет поддержки реальных неизменяемость.

ОБНОВЛЕНИЕ: В настоящее время ECMAScript 5< Стандарт /a> широко поддерживается. Он добавляет Object.seal и Object.freeze.

Метод Object.seal предотвратит добавление свойств, но позволит пользователю записывать или редактировать существующие свойства.

Метод Object.freeze полностью заблокирует объект. Объекты останутся такими же, какими они были, когда вы их заморозили. После того, как объект заморожен, его нельзя разморозить.

Больше информации:

person Christian C. Salvadó    schedule 11.03.2010
comment
Если вы создаете геттер-функцию, которая возвращает Object.freeze(theObject), то при использовании геттера невозможно изменить значения исходного объекта. - person Shahar; 27.04.2017
comment
Будет ли Object.freeze рекурсивно замораживать все свойства или только свойства объектов (верхнего уровня)? - person ; 14.12.2018
comment
@MrCholo, Object.freeze будет работать только на текущем уровне объекта, устанавливая собственные свойства, не настраиваемые и недоступные для записи, и предотвращая дальнейшие расширения (добавление новых свойств). Вы можете проверить внутренности зависания в следующем разделе спецификации: cms.gt/P7NKq - person Christian C. Salvadó; 14.12.2018
comment
И Object.seal, и Object.freeze теперь хорошо поддерживаются. - person Dave F; 18.04.2020