Günther Bauer wrote:
Quote:
Einen Link kann ich leider nicht posten, da dies zu unserer
Internetplattform gehört und noch nicht freigegeben wurde.
Eine Javascript Klasse definiere ich wie folgt: |
Wie schon erwähnt: JavaScript 1.x hat keine Klassen.
Das ist vermutlich der Konstruktor eines Prototyp-Objekts, deshalb
sollte er mit einem grossen Anfangsbuchstaben beginnen (Code Style).
Quote:
{
var _privatevar = null;
// Private Funktion
function _irgendwas()
{
} |
Die Analogie zur klassenbasierten Objektorientierung stimmt nicht. Das
ist keine private Funktion/Methode, d.h. eine nicht vererbbare, sondern
einfach eine Funktion, die nur innerhalb des lokalen
Konstruktorkontextes definiert ist.
Aufrufe der Form class_obj._irgendwas() sind in ECMAScript nicht
definiert. Wenn es dennoch funktioniert, ist es somit Ergebnis eines
implementationsabhängigen Verhaltens, welches sich schon morgen ändern
kann (so geschehen zwischen dem Release von Firefox 1.0.x und Firefox
1.5.x). Auf so etwas produktiven Code aufzubauen, bedeutet
zwangsläufig, die Wartungskosten unnötigerweise drastisch zu erhöhen.
Quote:
// Öffentliche Funktion
this.irgenwas = function()
{
} |
Das wird schlicht eine Methode des mit dem Konstruktor erzeugten Objekts
(`this' referenziert es bei Konstruktoraufruf). Sofern this.irgendwas()
also nicht Closures enthält, kann man es effizienter definieren:
class_obj.prototype.irgendwas = function()
{
// ...
};
Es wird dann nur ein Function-Objekt erzeugt (statt bei jedem
Konstruktoraufruf eines) und die mit dem Konstruktor erzeugten Objekte
erben die Methode über die Prototyp-Kette.
Quote:
Die Fehlermeldungen von Opera lauten wie folgt:
Inline script thread
Error:
name: TypeError
message: Statement on line 1: Could not convert undefined or null to
object
Backtrace:
Line 1 of linked script http://www.xxx.de/json.php?do=irgendwas
obj.fnc({"status":1, "value":"irgendwas"}); |
Da es nach ECMAScript 3 syntaktisch korrekt ist (und ich keine
Opera-Version vor 6.0 kenne), liegt es wahrscheinlich daran, dass `obj'
keine Objektreferenz ist (sondern `undefined' oder `null'). Debugging
in Firefox mit Firebug und/oder in Opera mit
window.alert(obj);
vor dem Aufruf sollte Aufschluss bringen.
Quote:
[TOFU: Text Oben, Fullquote Unten] |
http://lernst.de/zitieren/kriegst.de/antworten
PointedEars
--
Prototype.js was written by people who don't know javascript for people
who don't know javascript. People who don't know javascript are not the
best source of advice on designing systems that use javascript.
-- Richard Cornford, <f806at$ail$1$8300dec7 (AT) news (DOT) demon.co.uk>