Klassen in JavaScript
- Anzeige der Klasse eines Objektes (».call« nicht vergessen!)
Object.prototype.toString.call( new Number( 3.14 )) /* "[object Number]" */
»Number« ist darin das “value of the [[Class]] internal property”, also praktisch die Klasse des Objekts! (Auch, wenn einige Quellen behaupten, in JavaScript gäbe es keine Klassen.)
function className( object )
{ return 0,
Object.prototype.toString.call( object ).
replace( "\[object ", "" ).replace( "\]", "" ); }className( new Number( 3.14 ))
Klassen
Neu am 1. Juli 2014
“The value of the [[Class]] internal property is defined by this specification for every kind of built-in object. The value of the [[Class]] internal property of a host object may be any String value except one of "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", and "String". The value of a [[Class]] internal property is used internally to distinguish different kinds of objects. Note that this specification does not provide any means for a program to access that value except through Object.prototype.toString (see 15.2.4.2).” – 8.6.2 Object Internal Properties and Methods, Standard ECMA-262, 5.1 Edition / June 2011
Object.prototype.toString.call( "" )
"[object String]"
^ ^
| |
Typ KlasseObject.prototype.toString.call( 1 )
"[object Number]"
^ ^
| |
Typ KlasseObject.prototype.toString.call( true )
"[object Boolean]"
^ ^
| |
Typ Klasse
Die Klasse eines Objektes ist eine Eigenschaft, die in JavaScript derzeit sonst kaum eine Rolle spielt, aber auf die oben gezeigte Weise sichtbar gemacht werden kann.
Dennoch ist es manchmal ganz nützlich von der Klasse eines Objekts sprechen zu können, wenn man dies von anderen Programmiersprachen her so gewohnt ist.
Um das Verhalten von Objekten in JavaScript zu verstehen, muß man sich aber vor allem mit Prototypen und ferner Konstruktoren beschäftigen. Klassen kann man dafür vollkommen ignorieren.
In zukünftigen Versionen von JavaScript, die aber Mitte 2014 noch nicht verbreitet sind, wird es ein Schlüsselwort »class« geben, das aber auch nur eine alternative Schreibweise für eine bestimmte Verwendung von Prototypen und Konstruktoren sein wird.
und – als allumfassender Basistyp aller eben genannten Objekttypen:
[object Object]
Konsole
typeof 2 // "number" //
Object.prototype.toString.call( new String( "a" )) // "[object String]" //
Object.prototype.toString.call( new String( "a" )).slice( 8, -1 ) // "String" //