Я разрабатываю расширение для firefox, и я думаю, что сейчас обнаружил базовое недоразумение в отношении Javascript, а точнее, концепции «прототипа». Рассмотрим следующий минимальный пример, обратите внимание на различия, когда я устанавливаю переменные this.demo и this.test:
var Example = new Array();
Example.Foo = function() {
this.test = null;
this.demo = "World";
};
Example.Foo.prototype = {
initialize : function(resource) {
this.test = "Hello";
this.display();
},
display : function() {
alert(this.test + " " + this.demo);
},
}
window.addEventListener(
"load",
function() {
window.obj = new Example.Foo();
obj.initialize();
},
false
);
При открытии Firefox я получаю ожидаемый результат:
Hello World
Это всегда хорошо работает, пока отображается вызов ( ) 'внутри' исходного файла js. Однако, когда я вызываю display () с помощью соответствующего щелчка мышью в пункте меню, например: [
...
<menupopup id="menu_ToolsPopup">
<menuitem label="Example" oncommand="obj.display();"/>
</menupopup>
...
], я получаю:
null World
initialize (), конечно, был вызван заранее.
Я все еще новичок в Javascript и работаю с существующим кодом. Поэтому меня смущает текущее поведение. Какое лучшее решение для получения работает?