Определение Setter / Getter для непаренной локальной переменной: невозможно?

Есть несколько предыдущих вопросов о StackOverflow, в которых спрашивалось, как можно получить доступ к локальным переменным через цепочку областей, например, если вы хотите ссылаться на локальные переменные, используя скобочные обозначения и строку, вам нужно что-то вроде__local__["varName"], До сих пор я не нашел даже самого хакерского метода для достижения этой цели и не придумал метод после нескольких часов использования каждого трюка, который я знаю.

Целью этого является реализация методов получения / установки произвольных непаренных переменных. Object.defineProperties или__defineGet/Setter__ требует контекст для вызова. Для свойств в глобальном или оконном контекстах вы можете достигнуть цели наличия установщика / получателя для прямых ссылок на объект.

Object.defineProperty(this, "glob", {get: function(){return "direct access"})
console.log(glob); //"direct access"

Даже в моих тестах с пользовательским расширением я компилировал в модифицированный Chromium, который запускается до создания любого окна, где контекст является фактическим глобальным контекстом, и даже пытается вызватьthis непосредственно в глобальном контекстесбой моя программа, я могу выполнить это без помех:

Object.defineProperty(Object.prototype, "define", {
    value: function(name, descriptor){
        Object.defineProperty(this, name, descriptor);
    }
};
define("REALLYglobal", {get: function(){ return "above window context"; }});

И тогда он доступен во всех фреймах, созданных позже как глобальный, маршрутизируемый через указанный метод получения / установки. Старый__defineGet/Setter__ также работает в этом контексте, не указывая, что вызывать (не работает в Firefox, хотя вышеописанный метод работает).

Таким образом, в основном можно определить защиту get / set для любой переменной объекта, включая контекст окна / глобальный контекст с прямым вызовом объекта (вам не нужноwindow.propname, только чтоpropname). Это проблема, связанная с невозможностью ссылаться на непаренные переменные области действия, поскольку это единственный тип, который может находиться в доступной области, но не иметь адресуемого контейнера. Конечно, они также наиболее часто используются, так что это не крайний случай. Эта проблема также выходит за рамки текущей реализации Proxies в ES6 / Harmony, поскольку она связана именно с невозможностью обратиться к контейнеру локального объекта с синтаксисом языка.

Причина, по которой я хочу это сделать, заключается в том, что это единственный барьер, позволяющий перегрузить большинство математических операторов для использования в сложных объектах, таких как массивы и хэши, и получения сложного результирующего значения. Мне нужно иметь возможность подключиться к сеттеру в тех случаях, когда значение устанавливается для типа объекта, который я настроил для перегрузки. Нет проблем, если объект может быть глобальным или может содержаться в родительском объекте, что, вероятно, я просто выберу. Это все еще полезно сa.myObject, но цель состоит в том, чтобы сделать его максимально прозрачным для использования.

Не только это, но было бы очень полезно иметь возможность выполнить что-то вроде этого:

var point3d = function(){
    var x, y, z;
    return {
        get: function(){ return [x, y, z]; },
        set: function(vals){ x=vals[0]; y=vals[1]; z=vals[2]; }
    };
};

(Это похоже на деструктуризацию ES6, но имеет более общие приложения для реализации функциональности, связанной с получением / настройкой, а не только с переносом сложных значений). Даже этот основной код полностью потерпит неудачу:

var x = {myname: "intercept valueOf and :set: to overload math ops!", index: 5};
x++; //x is now NaN if you don't implement a setter somehow

Мне все равно, насколько хакерское решение, на данный момент это просто сильное любопытство относительно того, может ли оно быть достигнуто, даже если оно требует нарушения всех лучших практик, которые существуют. До сих пор я несколько сотен раз ломал Firefox и Chrome, пытаясь переопределить / перехватить / изменитьObject.prototype.valueOf/toString, Function.prototype Function.prototype.constructor, Function.prototype.call/apply, arguments.callee.callerи т. д. с бесконечными ошибками рекурсии и тому подобным в попытках задним числом задавать контексты буровой установки. Единственное, что мне удалось сделать, - это обернуть практически все это в eval и динамически создавать куски кода, что является мостом, который я слишком далеко не могу использовать. Единственный другой удаленно успешный маршрут был в использованииwith в сочетании с предварительным определением всех локальных переменных в контейнере, но это, очевидно, очень навязчиво из-за проблем с использованиемwith.

Ответы на вопрос(3)

Ваш ответ на вопрос