Wie kommt es, dass die Object-methode foo aufgerufen wird?
Das passiert nur im FF (nicht im IE oder Opera).
Dann machen IE und Opera was falsch.
Was passiert genau, wenn ich einer methode einen Namen verpasse (siehe methodX)?
Eigentlich nichts.
Doch, es wird ein neues Objekt erstellt und der Scope-Chain vorangestellt. Und was befindet sich in diesem Objekt? Bingo, über die Prototypen-Kette findet er dort die Funktion Object.prototype.foo!
Aber, da es nur FF macht, vermute ich hier einen Bug. FF scheint in dem Fall, die Suche nach dem Kontextobjekt anders anzugehen
Normalerweise: window -> Object
hier: Object -> window
Was du hier meinst, verstehe ich nicht. Das per Konstruktor erzeugte Objekt ist doch etwas anderes als das Kontextobjekt.
Warum kann ich mir nicht erklären, kein anderer Browser macht das so.
Hier die Erklärung:
Ecma-262, "13 Function Definition" (Seite 71) sagt zur Auswertung von function bla(){...}
als Function Expression:
- Create a new object as if by the expression new Object().
- Add Result(1) to the front of the scope chain.
- Create a new Function object as specified in 13.2 with parameters specified by FormalParameterListopt
and body specified by FunctionBody. Pass in the scope chain of the running execution context as the
Scope.- Create a property in the object Result(1). The property's name is Identifier, value is Result(3), and
attributes are { DontDelete, ReadOnly }.- Remove Result(1) from the front of the scope chain.
- Return Result(3).
1. und 2. sorgen dafür, dass Object.prototype.foo in der Scope Chain auftaucht. Firefox verhält sich also völlig konform zu Ecma-262.
Übrigens ein schönes Beispiel dafür, dass man Object.prototype besser in Ruhe lassen sollte. Oder wirklich Sorgfalt walten lassen muss.
Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|