Pracuję nad rozszerzeniem firefox i myślę, że mam teraz podstawowe nieporozumienie dotyczące Javascriptu, z koncepcją "prototypu", aby być dokładnym. Rozważmy następujący minimalny przykład, zauważyć różnice kiedy ustawić zmienne this.demo i this.test:mylić z "prototypem" (rozszerzenie Firefoksa)
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
);
Podczas otwierania Firefoksa uzyskać oczekiwany wynik:
Hello World
To działa zawsze dobrze to sposób tak długo, jak wyświetlanie połączenia() "wewnątrz" pliku źródłowego js. Jednak, gdy zgłoszę display() poprzez kliknięcie odpowiedniego wpisu z menu, np .:
...
<menupopup id="menu_ToolsPopup">
<menuitem label="Example" oncommand="obj.display();"/>
</menupopup>
...
uzyskać:
null World
initialize() została wywołana wcześniej, oczywiście.
Nadal jestem całkiem nowy w JavaScript i pracuję z istniejącym kodem. Dlatego jestem bardzo zdezorientowany obecnym zachowaniem. Jakie są najlepsze rozwiązania do uzyskania?
Sprawdź te dwa artykuły: http://www.javascriptkit.com/javatutors/oopjs2.shtml i http://mckoss.com/jscript/object.htm - kod jest rodzaj z całego miejsca. Jedną rzeczą, która może bardzo pomóc, to nie używać nazwy 'przykład' zarówno dla twojej definicji, jak i instancji; jest to bardziej mylące, gdy połowa kodu ma do czynienia z "przykładem" to i "przykładem", że. Zdobądź tam prawdziwe terminy - pomoże ci to przemyśleć. –
Jeśli sprawdzisz, jaki przedmiot jest "ten" podczas wywoływania z menuitem, myślę, że zobaczysz, że jest to menuitem, a nie obiekt, którego się spodziewałeś. – some
btw, Tablice są dla kiedy klucze są liczbami całkowitymi. W takim przypadku użyj obiektów: 'Example = {}'. (Również, gdy potrzebujesz tablicy, powinieneś użyć '[]' zamiast nowej tablicy. – hugomg