Я пытаюсь решить проблему, которая пришла мне в голову в последнее время. Допустим, мы хотели бы и знали бы, как сделать так, чтобы в javascript были динамические геттеры и сеттеры, больше похожие на те, что в php (__get, __set). Но поскольку javascript не имеет универсального свойства, единственное, что мы могли бы сделать, это предоставить список возможных ключей и выполнить итерацию, чтобы добавить геттеры и сеттеры только для них, и надеяться, что никто другой никогда не появится.
Но проблема далеко не решена. Итак, следующий подход, который пришел мне в голову, заключался в том, чтобы использовать неприятный хак с try
и catch
, чтобы в любой момент имя не было определено в объекте, чтобы использовать catch
в качестве геттера (по крайней мере), а затем возобновить код, жестко и, возможно, бессмысленное дело. Но отсюда и возникла моя вторая проблема в таком использовании:
console.log(g.someundefinedproperty);
результатом был бы вызов console.log
, показывающий undefined
без каких-либо исключений. И тогда меня осенило: что, если бы я использовал оригинальный window.undefined
геттер и сеттер, в конце концов, он должен вызываться каждый раз, когда я ошибаюсь и неправильно пишу слово или что-то в этом роде.
Так что я попробовал
Object.defineProperty(window, 'undefined', {
get : function ()
{
// functional code, including getting the caller and figuring out
// where we are, and what we have to do... easy :D
console.log('works');
},
set : function ()
{
// some couple more fine hacks here
console.log('this too');
}
});
Но, к сожалению, свойство окна undefined
равно configurable : false
. Другие попытки взлома заключались в клонировании объекта window
, за исключением undefined
и внутреннего свойства window
. И на новом объекте, чтобы определить новый undefined
(обратите внимание на иронию), а затем window = mybetterwindow
;
Поскольку это не вызвало каких-либо проблем, я возлагал большие надежды, но система снова подвела меня, поскольку window
не может быть перезаписана по замыслу. Я предположил, что у него есть собственный геттер и он восстанавливается на основе прототипа, найденного в window.prototype
или даже лучше Window.prototype
(обратите внимание на верхний регистр).
В качестве последнего шага в этом эксперименте я переопределил undefined
при запуске этого прототипа. Безрезультатно, ничего не изменилось ... Я попытался создать new Window()
, но Window
не конструктор, не получилось!
Поскольку у меня кончились идеи, я пишу здесь эту мольбу о помощи. Если у вас есть идеи, как решить проблему динамических геттеров и сеттеров (the existencial problem of life, universe and everything else
) таким способом, который никоим образом не изменяет ... способ, которым я использую объекты (и в качестве бонуса это не need to break
a hole
в fabric of time and space
) или синтаксис, умоляю вас говорить или вечно молчать :).
undefined
действительно рискует пробить дыру в ткани времени и пространства. Может поэтому в ES5 это запрещено. Это интересный вопрос, однако я предвижу, что в большинстве ответов и комментариев будет сказано, что универсальные средства доступа не нужны и вредны. Черт возьми, вы даже приводите в пример PHP! :П - person bfavaretto   schedule 13.12.2012eval
ed, до которой я теряю время и память. У меня есть друг (@khael), который выполняет какую-то «Monkey Patching», используя ту же технику, но на PHP, и делает это только один раз для каждого проекта, после чего сохраняет проект как «Monkey Patched». - person helly0d   schedule 18.12.2012self writing
аксессуаром это боль в a ** для браузера, чтобы все приложение было переписано и переинтерпретировано, и отладка также была бы болезненной, но спасибо за идею. - person helly0d   schedule 18.12.2012