Задать вопрос
@oldzas

Как правильно создать объект на JS?

Добрый день.

Подскажите, как правильно создать объект на jS?

Если указать как:

let user = {
  name: "John",
  age: 30,
};


То, это изменяемые данные.

А я еще хочу добавить данные, которые нельзя изменять, например так:

const user = {
proff: "ingeneer"
};

И подскажите как мне обьеденить (и можно ли так делать) что бы указать что будет неизменяемым, а что изменяемым у этого объекта?

Спасибо.
  • Вопрос задан
  • 93 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 2
lazalu68
@lazalu68
Salmon
Наверное как-то с использованием приватных переменных:

class User {
    #proff;

    constructor(name, age, proff) {
        this.name = name;
        this.age = age;
        this.#proff = proff;
    }

    get proff() {
        return this.#proff;
    }
}

const my_user = new User('name', 29, 'luftwaffe');

console.log(my_user.age); // 29
my_user.age = 92;
console.log(my_user.age); // 92

console.log(my_user.proff); // luftwaffe
my_user.proff= 'kriegsmarine';
console.log(my_user.proff); // luftwaffe


Еще можно с помощью defineProperty и writable: false, но это как-то не очень красиво
Ответ написан
Комментировать
Seasle
@Seasle Куратор тега JavaScript
Вариант 1 - Полностью сделать объект неизменяемым.
const obj = Object.freeze({
  name: 'John',
  age: 31
});

obj.age = 32;
obj.email = 'john@example.com';

console.log(obj); // { name: 'John', age: 31 }

Вариант 2 - Добавлять новые поля при помощи Object.defineProperty.
const obj = {
  name: 'John',
  age: 31
};

Object.defineProperty(obj, 'other', {
  value: 'some data',
  writable: true,
  enumerable: true
});

Object.defineProperty(obj, 'email', {
  value: 'john@example.com',
  enumerable: true
});

Object.defineProperty(obj, 'secret', {
  value: 'Woop-woop'
});

console.log(obj);
/* {
  name: 'John',
  age: 31,
  other: 'some data',
  email: 'john@example.com'
} */
obj.other = 'another data';
console.log(obj);
/* {
  name: 'John',
  age: 31,
  other: 'another data',
  email: 'john@example.com'
} */
console.log(obj.secret); // 'Woop-woop'
obj.secret = 'Boop-boop';
console.log(obj.secret); // 'Woop-woop'

Также, все defineProperty можно объединить в один:
Object.defineProperties(obj, {
  other: {
    value: 'some data',
    writable: true,
    enumerable: true
  },
  email: {
    value: 'john@example.com',
    enumerable: true
  },
  secret: {
    value: 'Woop-woop'
  }
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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