Добавить псевдоним для свойства в JavaScript
Я думаю, что это довольно просто,
Есть ли простой способ добавить вторичное имя для свойства (я думаю, что это одно значение String - я не уверен), т.е.
c = length // this line pseudo code
'hello world'.length // returns 11
'hello world'.c // this line is pseudo code, meant to return 11
В приведенном выше примере существует псевдоним, созданный для длины свойства. Можно ли это сделать в JavaScript?
Ответы
Ответ 1
1. Обозначение скобок
С записью скобок вы можете получить доступ к свойству следующим образом:
'hello world'[c]
Это делает то же самое, что и 'hello world'.length
, если c
является 'length'
как строка.
var c = 'length';
console.log('hello world'[c]);
Ответ 2
Чтобы расширить ответ на @AndrewLi, есть куча псевдонимов, которые вы можете сделать с помощью Object.defineProperty()
.
- Псевдоним только для чтения (так же, как и его ответ)
- Синхронизированный псевдоним изменяет источник при его изменении
- Псевдоним по умолчанию читает или "по умолчанию" до тех пор, пока не будет изменен (в какой момент отношения нарушены)
Я напишу их как функции, которые связывают объект source с свойством sProp и объект target с свойством > tProp. Источник и цель могут быть одним и тем же объектом (позволяя свойству быть псевдонимом другого свойства на одном и том же объекте), но это не является обязательным требованием. Кроме того, источник (или цель) может быть прототипом (например, Object.prototype, String.prototype и т.д.)
"Нормальное" назначение
Это не действительно псевдоним, и он не использует Object.defineProperty()
. Целевому назначается VALUE источника, а не ссылка на него. Это означает, что когда источник изменяется, цели нет.
function assign(target, tProp, source, sProp) {
target[tProp] = source[sProp];
return target;
}
let myTarget = {}
let mySource = {b: 12}
myTarget = assign(myTarget, 'a', mySource, 'b')
// "alias" was assigned source value
console.log('"alias":',myTarget.a) // 12
// changes to source independent of "alias"
mySource.b = 13
console.log("source:", mySource.b) // 13
console.log('"alias":', myTarget.a) // still 12