Как вернуть свойство по умолчанию литерального объекта JS по умолчанию?

#javascript #properties #object-literal

#javascript #свойства #объект-литерал

Вопрос:

Один объект JS определяется следующим образом:

 var obj = {
      key1 : {on:'value1', off:'value2'},
      key2 : {on:'value3', off:'value4'}
}
 

Есть ли сложный способ выбрать key1 on свойство по умолчанию, когда obj.key1 оно передается без свойства?

 var key1State = obj.key1; // I want to receive 'value1' here, not obj.key1{...}
 

Можно ли как-то вообще распознать в теле определения объекта, какое свойство (если оно вообще есть) передается / запрашивается во время вызова объекта?

Ответ №1:

Я не уверен, что это то, что вам нужно, но возиться с valueOf or toString может быть тем, что вы ищете.

Например:

 var obj = {
      key1 : {on:'value1', off:'value2', toString : function(){ return this.on; }},
      key2 : {on:'value3', off:'value4', toString : function(){ return this.on; }}
}

var key1State = obj.key1; // the object
var key1StateStr = ''   obj.key1; // string "value1"
obj.key1 == "value1"  // true
obj.key1.toString() === "value1"  // true
 

Так что, если вы собираетесь использовать значение по умолчанию в качестве строки где-нибудь, это может быть полезно.

Комментарии:

1. Это очень полезно, 1. Работает ли это (и только тогда), потому toString() что вызывается неявно каждый раз, когда объект используется в String контексте? Например console.log(`${obj.key1}`) , или let value = '' obj.key1 .

2. Да, здесь играет роль неявное преобразование типов.

Ответ №2:

Это не исправит ваше дело, но вы можете счесть это полезным.

Используйте геттеры.

 var obj = {

  key1 : {on:'value1', off:'value2'},
  key2 : {on:'value3', off:'value4'}, 
  get fooBar () { return this.key1.on }

}
 

теперь obj.fooBar возвращает keyq.on

Комментарии:

1.Или используйте get key1() set key1(value) etc. (удаление / переименование key1 самого себя)

Ответ №3:

Я понимаю вашу идею, но думаю, что лучший способ здесь — использовать функцию like getState для получения фактического состояния объекта.

 var obj = {
  key1: {on:'value1', off:'value2'},
  key2: {on:'value3', off:'value4'}
};

var key1State = getState(obj.key1);
var key2State = getState(obj.key2.off);

function getState(obj) {
  return obj.on || obj;
}

console.log(key1State, key2State);
 

Смотрите codepen .