Подтвердить что ты не робот

Добавить псевдоним для свойства в 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?

4b9b3361

Ответ 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