#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);