Sto sviluppando un'estensione per Firefox e penso di aver subito un malinteso di base per quanto riguarda Javascript, con il concetto di "prototipo" per essere precisi. Si consideri il seguente esempio minimo, notare le differenze quando ho impostato le variabili this.demo e this.test:confuso con "prototype" (estensione per Firefox)
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
);
Nell'aprire Firefox ottengo i risultati attesi:
Hello World
questo funziona sempre bene questo modo fino a quando una chiamata display() 'all'interno' il file di origine js. Tuttavia, quando chiamo display() tramite corrispondente click da una voce di menu, ad es .:
...
<menupopup id="menu_ToolsPopup">
<menuitem label="Example" oncommand="obj.display();"/>
</menupopup>
...
ottengo:
null World
initialize() è stato chiamato in anticipo, naturalmente.
Sono ancora piuttosto nuovo su Javascript e lavoro con codice esistente. Sono quindi abbastanza confuso con il comportamento attuale. Qual è la migliore soluzione per ottenere funziona?
Guarda anche questi due articoli: http://www.javascriptkit.com/javatutors/oopjs2.shtml e http://mckoss.com/jscript/object.htm - il codice è tipo di tutto il posto. Una cosa che aiuterà molto, penso, è non usare il nome 'example' per la tua definizione e istanza; è più confuso quando metà del tuo codice ha a che fare con "esempio" questo e "esempio" quello. Ottieni alcuni termini reali - ti aiuterà a riflettere. –
Se si controlla quale oggetto 'questo? È quando si chiama dal menuitem, penso che scoprirete che è il menu e non l'oggetto che vi aspettavate. – some
btw, le matrici sono per quando le chiavi sono numeri interi. In questo caso usa gli oggetti: 'Esempio = {}'. (Inoltre, anche quando hai bisogno di un array dovresti usare '[]' invece della nuova matrice. – hugomg