← Назад к вопросам

Можно ли создать свойство доступное только для чтения?

1.0 Junior🔥 151 комментариев
#Soft Skills и рабочие процессы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Создание свойств только для чтения в JavaScript

Да, существует несколько способов создать свойства, которые нельзя изменять после инициализации. Это важный паттерн для защиты данных и создания надёжного кода.

Object.defineProperty()

Классический метод - использование Object.defineProperty() с флагом writable:

const user = {};

Object.defineProperty(user, 'id', {
  value: 12345,
  writable: false,      // Запретить изменение
  configurable: false,  // Запретить переконфигурирование
  enumerable: true      // Показывать в for...in
});

console.log(user.id);      // 12345
user.id = 99999;           // Ошибка в strict mode (молча игнорируется в обычном)
delete user.id;            // Ошибка в strict mode

Getter без setter

Используя Object.defineProperty или классы, можно создать свойство только для чтения через getter:

class User {
  #id;  // Приватное поле

  constructor(id) {
    this.#id = id;
  }

  get id() {
    return this.#id;  // Только чтение
  }
}

const user = new User(123);
console.log(user.id);    // 123
user.id = 999;           // Присваивание игнорируется

Приватные поля (#)

Самый современный и рекомендуемый способ:

class Product {
  #price;  // Приватное поле

  constructor(price) {
    this.#price = price;
  }

  getPrice() {
    return this.#price;
  }
}

const product = new Product(99.99);
console.log(product.getPrice());  // 99.99
console.log(product.#price);      // SyntaxError вне класса

Object.freeze()

Для объектов - заморозить все свойства:

const config = {
  apiUrl: 'https://api.example.com',
  timeout: 5000
};

Object.freeze(config);

config.apiUrl = 'https://other.com';  // Молча игнорируется
config.newProp = 'value';             // Молча игнорируется

console.log(config.apiUrl);  // Остаётся 'https://api.example.com'

readonly в TypeScript

TypeScript предоставляет compile-time защиту через readonly:

interface User {
  readonly id: number;
  readonly email: string;
  name: string;
}

const user: User = { id: 1, email: 'test@test.com', name: 'John' };
user.name = 'Jane';    // OK
user.id = 2;           // Ошибка компилятора (не выполняется в runtime)

class Product {
  readonly sku: string;

  constructor(sku: string) {
    this.sku = sku;
  }
}

Сравнение подходов

Object.freeze() работает для всего объекта, Object.defineProperty() для отдельных свойств, приватные поля скрывают данные полностью. Для React компонентов и современного JavaScript используй приватные поля или TypeScript readonly.

Можно ли создать свойство доступное только для чтения? | PrepBro