Как наследовать задачи в VSCode?

Из другого ответа, который я недавно опубликовал, это в V8, и я думаю, что JavaScriptCore, но не Firefox, и это не спецификация. Поскольку вы можете захватить операцию и компараторы, вы можете реализовать собственную перегрузку оператора в большинстве ситуаций с небольшим количеством работы.

var actions = [];
var overload = {
  valueOf: function(){
    var caller = arguments.callee.caller;
    actions.push({
      operation: caller.name,
      left: caller.arguments[0] === this ? "unknown" : this,
      right: caller.arguments[0]
    });
    return Object.prototype.toString.call(this);
  }
};
overload.toString = overload.valueOf;
overload == 10;
overload === 10;
overload * 10;
10 / overload;
overload in window;
-overload;
+overload;
overload < 5;
overload > 5;
[][overload];
overload == overload;
console.log(actions);

Выход:

[ { operation: 'EQUALS',
    left: overload,
    right: 10 },
  { operation: 'MUL',
    left: overload,
    right: 10 },
  { operation: 'DIV',
    left: 'unknown',
    right: overload },
  { operation: 'IN',
    left: overload,
    right: DOMWindow },
  { operation: 'UNARY_MINUS',
    left: overload,
    right: undefined },
  { operation: 'TO_NUMBER',
    left: overload,
    right: undefined },
  { operation: 'COMPARE',
    left: overload,
    right: 5 },
  { operation: 'COMPARE',
    left: 'unknown',
    right: overload },
  { operation: 'ToString',
    left: 'unknown',
    right: overload } ]

На этом этапе вы имеют все входы и операцию, так что оставшаяся часть является результатом операции. Получатель операции получит примитивное значение, будь то строка или номер, и вы не можете этого предотвратить. Если это не произвольный приемник, скажем, экземпляр класса, в котором вы перегружены оператором, вы можете обрабатывать различные ловушки get / set для перехвата входящего значения / предотвращения перезаписи. Вы можете хранить операнды и операции в некотором центральном поиске и использовать простой метод для отслеживания примитивного значения обратно к операции, которая его создала, а затем создать любую логику, которую вы хотите выполнить свою собственную операцию. Другой метод, который позволил бы произвольным приемникам, которые впоследствии могли быть перестроены в сложные формы, заключался бы в кодировании данных в примитивное значение, чтобы его можно было отменить обратно в ваш сложный класс. Например, значение RGB из 3 различных 8-битных целых чисел (255,255,255) может быть преобразовано в одно число на конце завершения, а конец приемника может тривиально преобразовать его обратно в его сложные компоненты. Или для более сложных данных вы можете даже вернуть сериализованную строку JSON.

Имея доступ к протоколам Harmony Proxy (Firefox6 +, Nodejs с флагом), этот процесс становится намного проще, так как вы можете создавать прокси-серверы в основном для всего и интроспекция всего процесса из конца в конец и делать все, что вы хотите. Экземпляры операнда ваших данных / класса, значениеOf / toString / getters любого возможного значения, к которому может обращаться внутренний движок, любой объект-получатель, у вас есть предварительная осведомленность и даже захват произвольных приемников в случае with(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }

1
задан TN. 17 January 2019 в 08:46
поделиться