Задать вопрос
ermek6
@ermek6
::Живу с удовольствием::

Как правильно реализовать getter/setter по ключу?

Всем привет. Есть такой код:

const user={
	id:1,
	name:"Юрий",
    group: 123
}
console.log(user);
const keys= Object.keys(user).map(function (k){return k});
console.log(keys);

function changeProp(obj, prop){
	obj["_"+prop] = obj[prop];
	delete obj[prop];
        ///?!?!?!!!! Object.defineProperty(obj, prop, {get: ()=>{}, set: (val)=>{}})
}

keys.map(
	function(key){
		changeProp(user, key)
	}
	)
	
console.log(user)


Теперь не знаю, как определить поля get/set в defineProperty, что бы корректно получать значение полей.
Цель:

Объект user получается с сервера, и я хочу запретить изменение поля id, а при обращении к group обращаться к серверу для получения имени группы.

p.s.
user тут для примера. какие объекты будут прилетать не известно, их метаданные буду выдергивать запросом OPTIONS
  • Вопрос задан
  • 140 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
ermek6
@ermek6 Автор вопроса
::Живу с удовольствием::
Надо использовать метод bind

const user={
  id:1,
  name:"Юрий",
  group: 123
}

const keys= Object.keys(user).map(function (k){return k});

function changeProp(obj, prop){
  obj["_"+prop] = obj[prop];
  
  function getProp() {
  	return "=="+this["_"+prop];
  }
  
  function setProp(value) {
  	this["_"+prop]=value;
  }
  
  getProp.bind(obj);
  setProp.bind(obj);
  
  delete obj[prop];
  Object.defineProperty(
  	obj, 
  	prop, 
  	{
  		get: getProp,
  		set:setProp
  		},
  	)
}

keys.map(
  function(key){
    changeProp(user, key)
  }
  )
  

console.log(user.name)
user.name='Bad Man';
console.log(user.name)


Output:

==Юрий
==Bad Man
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@2bllk
Чтобы запретить изменение поля id, нужно выполнить такой код:
Object.defineProperty(user, "id", {
    value: user["id"],
    writable: false
})

Если проблема только в запрете изменения значения id, то лучше всего реализовать это так
Ответ написан
Ваш ответ на вопрос

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

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