Что такое приемник в JavaScript?

Я читаю Вы не знаете JS: ES6 и Beyond. Я нашел какую-то путаную формулировку вроде

Мы объявляем обработчик get (..) как именованный метод объекта-обработчика (второй аргумент Proxy (..)), который получает ссылку на целевой объект (obj), имя свойства ключа ( "a" ) и self/receiver/proxy (pobj).

Мой вопрос в том, что означает приемник и откуда его имя?

Похоже, если у меня есть объект a с функцией-функцией jump:

var a = { jump: function(){console.log('jump!')} };

Если я запустил a.jump();, тогда a - приемник.

Это так? Пожалуйста, поправьте меня, если я ошибаюсь. Большое спасибо!

Для людей, которые читают одну и ту же книгу, когда вы приходите в раздел

Как вы можете видеть, благодаря названию третьего аргумента get trap автором, контексту, приемник может меняться в соответствии с лексическим кодом - greeter.everyone();. Пожалуйста, обратитесь к Oriol очень подробный ответ ниже для лучшего понимания. Спасибо, ребята!

Ответы

Ответ 1

Приемник - это объект, в котором происходит поиск свойств.

Итак, если вы используете a.jump, a - приемник.

Концепция применима только в том случае, если вы можете выполнить произвольный код, когда происходит поиск этого свойства. В основном это означает:

  • Свойства аксессуаров.

    Вы можете получить доступ к ресиверу, используя this внутри приемника или сеттера. Обычно приемником является объект, в котором вы определили свойство, или другой объект, который наследуется от него.

    var target = {
      get getReceiver() { return this; }
    };
    target.getReceiver; // target
    var inherits = Object.create(target);
    inherits.getReceiver; // inherits
    

    Встроенный пример __proto__, определяемый как свойство Object.prototype, но ожидаемый для его получения или установки на других объектах (получателях).

  • Объекты прокси

    Объекты прокси позволяют определять ловушки get или set, которые запускают функцию при попытке получить или установить любое свойство в прокси. Приемник предоставляется в качестве аргумента этой функции. Приемник обычно будет сам объект Proxy или объект, который наследует его.

    var proxy = new Proxy({}, {
      get: function(target, property, receiver) {
        return receiver;
      }
    });
    proxy.getReceiver; // proxy
    var inherits = Object.create(proxy);
    inherits.getReceiver; // inherits
    

Обратите внимание, что вы можете использовать Reflect.get или Reflect.set указать произвольные приемники:

Reflect.get(target, "getReceiver", arbitraryValue); // arbitraryValue ¹
Reflect.get(proxy, "getReceiver", arbitraryValue); // arbitraryValue

¹ Если геттер был определен в нестрочном режиме, он будет Object(arbitraryValue).

Название "приемник" исходит из спецификации, см. "Внутренние методы и внутренние слоты"

  • [[Get]] & emsp; (свойствоKey, Receiver) → any

    Возвращает значение свойства, ключ которого - свойствоKey из этого объекта. Если какой-либо код ECMAScript должен быть выполнен для извлечения значение свойства, приемник используется как значение this, когда оценивая код.

  • [[Set]] & emsp; (свойствоKey, значение, Receiver) → Boolean

    Задайте значение свойства, ключ которого является значением свойстваKey. Если для установки значения свойства необходимо выполнить какой-либо код ECMAScript, При оценке кода приемник используется как this. Возвращает true, если значение свойства было установлено или false, если оно не удалось установить.