Wie bezeichnet man diese Methoden?
Elefantast
- javascript
Hallo Leser,
vor einiger Zeit bin ich auf 2 Arten von Methoden gestoßen, über die ich mich nun gern weiter informieren möchte. Jedoch habe ich vergessen wie man diese bezeichnet.
Ein Codebeispiel sagt mehr als tausend Worte…
(function ( window, undefined ) {
var document = window.document,
Person = function ( eigenschaften ) {
return new Person.fn.initialize( eigenschaften );
};
Person.fn = Person.prototype = {
alter: null,
geschlecht: null,
initialize: function ( eigenschaften ) {
var key;
if ( eigenschaften ) {
for ( key in eigenschaften ) {
this[ key ] = eigenschaften[ key ];
}
}
return this;
},
gruss: function ( name ) {
var text;
if ( this.geschlecht === "mann" ) {
text = ( this.alter > 18 ? "Guten Tag " + name : "Ey, " + name + ", alter!");
} else {
text = ( this.alter > 18 ? "Hallo " + name : "Huhu " + name + "!" );
}
alert( text );
Person.niessen();
return this;
}
};
Person.niessen = function () {
alert( "Hatschi!" );
}
// Aufruf der Methoden:
var Stefan = Person({
alter: 42,
geschlecht: "mann"
});
Stefan.gruss( "Christian" ); // -> Guten Tag, Christian!
Person.niessen(); // -> Hatschi!
Stefan.niessen(); // -> Uncaught TypeError: Object [object Object] has no method 'niessen'
Person.gruss(); // -> Uncaught TypeError: Object [object Object] has no method 'gruss'
})( this );
Es geht mir dabei im speziellen um die Methoden Person.fn.gruss
und Person.niessen
.
Während erstere nur über eine Instanz des Person
-Objektes aufgerufen werden kann
und dabei sowohl auf dessen Eigenschaften als auch auf “äußere” Methoden wie im Falle des Beispiels auf
Person.niessen
Zugriff hat, fungiert letztere eher als eine Art
public static function
einer Klasse wie ich sie aus PHP kenne.
Ich würde mich über Suchbegriffe und weiterführende Literatur (englisch bevorzugt) sehr freuen.
Mit freundlichen Grüßen,
Elefantast
--
Alles was nicht mit Elefanten zu tun hat ist Irrelefant.
Lieber Elefantast,
hier etwas Pflichtlektüre, bevor Du hier weiter fragst:
* Geheimnisse der JavaScript-Syntax
* Organisation von JavaScripten
* Objektabfragen und Fallunterscheidungen in JavaScript
Liebe Grüße,
Felix Riesterer.
Es geht mir dabei im speziellen um die Methoden
Person.fn.gruss
undPerson.niessen
.
Während erstere nur über eine Instanz desPerson
-Objektes aufgerufen werden kann
und dabei sowohl auf dessen Eigenschaften als auch auf “äußere” Methoden wie im Falle des Beispiels auf
Person.niessen
Zugriff hat, fungiert letztere eher als eine Art
public static function
einer Klasse wie ich sie aus PHP kenne.
Ja, Person.niessen ist eine statische Funktion, die nur über das Objekt Person erreichbar ist.
Person.fn ist in deinem Code ein Synonym für Person.prototype, mehr darüber findest du in den von Felix verlinkten Artikeln.
Es stimmt aber nicht, dass die Funktion nur über eine Instanz erreichbar ist. Du kannst die Funktion auch direkt aufrufen, aber um diese dann an die aktuelle Instanz koppeln zu können, musst du apply oder call verwenden.
Also in etwa so:
Person.fn.niessen.apply(Stefan);
Struppi.
Hallo Leser,
vor einiger Zeit bin ich auf 2 Arten von Methoden gestoßen, ...
ich bin nicht einverstanden mit der formulierung, daß es verschiedene Arten von Methoden gäbe.
Ich behaupte, Funktionen sind immer das selbe, ob man sie nun statisch nennt oder nicht, egal, ob sie zu einem Objekt gehören oder nicht. Einzig die Bedeutung von "this" ändert sich, was man mit der Möglichkeit, auf Objekteigenschaften zuzugreifen vergleichen (verwechseln) könnte.
Ich finde, wenngleich es bequem ist, die Begriffe Klassenbasierter OOP Sprachen zu verwenden (was ich auch tue: "Methoden, Attribute, private, public, ...") sollte man sich im klaren sein, daß es nicht das selbe ist. Javascript hat keine Klassen, kein private, kein public, ...
Alles sind Objekte: Arrays, Funktionen, Numbers, Strings, (...)
"Member" sind Elemente dieser Objekte und wieder Objekte.
"Methoden" sind Funktionen, private und public hängt nur vom Namensraum ab, usw.
Versuch mal (auch wenns nicht identisch ist) Objekte als Arrays zu verstehen:
window: ein Array,
window["document"]: ein Element und wieder ein Array,
window["Person"] auch Element und Array,
window["Person"]["niessen"] ein Element und Funktion,
...
Das und das Prinzip der Namespaces macht eigentlich fast alles deutlich, finde ich.
Bei Recherchen halte ich mich gern an die Entsprechenden Spezifikationen, oder ich lese Artikel/Arbeiten auf Uni-Seiten ("inurl:uni"). Die sind nicht zwangsläufig besser als andere Quellen, aber meistens sehr umfangreich und von der Intention her vollständig und nachvollziehbar (Quellenangaben).
Suchbegriffe vielleicht: "prototypisches Objekt", "prototypical oop"
(beim Begriff "prototype" findet man ja leider immer das framework)
Versuch mal (auch wenns nicht identisch ist) Objekte als Arrays zu verstehen:
Wieso das? Oben sagst du doch schon, dass alles Objekte sind, jetzt willst du das alles Arrays sind?
window: ein Array,
Nein ein Objekt.
window["document"]: ein Element und wieder ein Array,
Ein Element des Objekts. Du verwendest hier halt nur den Indexoperator als Zugriffsmöglichkeit. Das ist eine besonderheit in JS, dass der Indexoperator für Arrays verwendet werden kann und um auf Methoden von Objekten zu zugreifen. Sie werden aber daruch nicht zu Arrays
Das und das Prinzip der Namespaces macht eigentlich fast alles deutlich, finde ich.
Jetzt führst du auch einen Begriff ein, der hier nicht der richtige ist. Ich halte die Bezeichnungen statische Variabel, um ein bestimmtes Verhalten zu erklären, für mindestens genauso angebracht. Wobei ich aber Namespaces, für etwas hochgegriffen halte, da diese auch nur mit bestimmten Konstrukten simuliert werden können und nicht einfach durch Objekte an sich.
Struppi.
Versuch mal (auch wenns nicht identisch ist) Objekte als Arrays zu verstehen:
Wieso das? Oben sagst du doch schon, dass alles Objekte sind, jetzt willst du das alles Arrays sind?
Ich hätte sagen sollen:
Ich meinte das mit den Arrays und meine folgende Aufzählung nur als Denkhilfe. Ich bin nicht der Meinung, daß es technisch korrekt ist.
Das und das Prinzip der Namespaces macht eigentlich fast alles deutlich, finde ich.
Jetzt führst du auch einen Begriff ein, der hier nicht der richtige ist.
Du hast Recht, tut mir leid. Ich glaube, "scope" wäre der richtige Begriff, nicht Namensraum/Namespace.
Ich habe nichts gegen die anderen Begriffe, ich empfehle nur besagte Denkweise, weil man so mit wenigen Prizipien das Verhalten von einem Großteil der Srache erklären kann.
Ich hätte sagen sollen:
Ich meinte das mit den Arrays und meine folgende Aufzählung nur als Denkhilfe. Ich bin nicht der Meinung, daß es technisch korrekt ist.
Naja, ich finde es immer wieder ermüdend Anfänger zu erklären, das ein Objekt kein Array ist, weil viele den Begriff assoziatives Array kennen und benutzen. Der aber in JS keinen Sinn macht, da dieses "Array" keine Funktionen eines Arrays hat. Ein Object ist ein Object, fertig.
Das und das Prinzip der Namespaces macht eigentlich fast alles deutlich, finde ich.
Jetzt führst du auch einen Begriff ein, der hier nicht der richtige ist.
Du hast Recht, tut mir leid. Ich glaube, "scope" wäre der richtige Begriff, nicht Namensraum/Namespace.
Ja sicher, aber das mit dem Namensraum, ist ja das, was du vorher kritisiert hattest, das man Begriffe verwendet, die nicht 100% korrekt sind, aber ein Verhalten beschreiben sollen, dass es so in JS nicht gibt.
Da es (noch) keine Namespaces in JS gibt, wird diese Umsetzung über den Scope eines Objektes, aber oft so bezeichnet. Ich kritisiere gar nicht das du ihn verwendest, ich war nur verwundert, weil du die Verwendung anderer Begriffe in deinem Post bemäkelt hattest.
Ich habe nichts gegen die anderen Begriffe, ich empfehle nur besagte Denkweise, weil man so mit wenigen Prizipien das Verhalten von einem Großteil der Srache erklären kann.
Eben. Nur bei deinem Vorschlag mit dem Array - da empfehle ich es nicht
Struppi.