Эта техника "частного государства" становится все более идиоматичной в последние несколько лет. Лично я нашел это странным ограничением при попытке быстро отладить что-то с консоли или переопределить поведение в сторонней библиотеке. Это один из немногих случаев, когда я думаю: «Черт, почему я не могу сделать это с помощью языка». Я использовал эту ошибку в Firefox 2 для хорошего эффекта, когда мне действительно нужно было быстро отладить "приватную переменную".
Мне было бы интересно узнать, когда другие используют эту идиому или когда они ее избегают. (@bobince Я смотрю на тебя).
В любом случае @bobince в значительной степени ответил на ваш вопрос (вкратце: нет, вы не можете получить доступ к переменной canvasDiv
из области, в которой находитесь).
Однако есть одна вещь, которую вы можете сделать, это обмен между взломом или редактированием сторонней библиотеки (я всегда хакую;): вы можете дополнить объект, чтобы он содержал ссылку, которая, как вы знаете, вам понадобится позже.
Hack 1 : если вы сами управляете объектами:
var canvas = document.getElementById('canvas');
var gr = new jsGraphics(canvas);
gr._canvasDiv = canvas; // Augment because we'll need this later
// Sometime later...
gr._canvasDiv; // do something with the element
Если библиотека поддерживает какую-то концепцию, похожую на деструктор (запускается при выгрузке страницы или чего-то в этом роде), не забудьте также обнулить или удалить ваше свойство во избежание утечек памяти в IE:
delete gr._canvasDiv;
ИЛИ Hack 2 : перезаписать конструктор сразу после включения библиотеки:
// run after including the library, and before
// any code that instantiates jsGraphics objects
jsGraphics = (function(fn) {
return function(canvas) {
this._canvasDiv = canvas;
return fn.apply(this, arguments)
}
}(jsGraphics))
Затем получите доступ к элементу (теперь общедоступному) как gr._canvasDiv
. То же самое относится и к удалению при выгрузке страницы.