gruss Kambfhase,
Ich hatte vor eine neue Klasse auf Basis eines Arrays zu schreiben,
die ihn um einige Methoden erweitert.
<p class="korinthenkackermodus">
Du wolltest einen konstruktor schreiben, dessen objekte ihren kontext
sowohl beim instanziieren als auch beim methodenaufruf delegieren.
im ersten fall explizit an [[Array]] ueber eine der call-methoden [call]
bzw. [apply], im zweiten fall implizit ueber die methoden des leeren am
konstruktor haengenden array-objekt-prototypen.
</p>
function sdkSlice( arg){
Array.apply( this, arguments);
}
sdkSlice.prototype = new Array();var a1 = new Array(8,17,26,35,44,53,62,71,80);
confirm( a1.toString());
var s2 = new sdkSlice(8,17,26,35,44,53,62,71,80);
confirm( s2.toString());
sehr schoene schachzuege - aber ...
> Leider spuckt mir mein Firefox "Fehler: Array.prototype.toString
> called on incompatible Object" aus. Mache ich etwas falsch, oder
> kann man von nativen Klassen nichts erben?
doch, das ist in JavaScript sogar auf vielen wegen moeglich.
dummerweise sperren sich nun aber alle mir bekannten implementierungen
von [[Array]] gegen wirklich jeden versuch, auf direktem weg als basistyp
fuer selbstimplementierte listen jeglicher art zu dienen - selbst wenn man
alle huerden meistert, bekommt man die eigenschaft [length] bei keinem
browser unter kontrolle.
als einziger aber nicht wirklich gewollter bzw. ueberhaupt nicht eleganter
ausweg bliebe die implementierung solcher listen-konstruktoren als wrapper,
wobei man \*length\*, um browseruebergreifend kompatibel zu bleiben, leider
als [getLength]- bzw. [setLength]-methoden anlegen muesste.
> Gibt es sonst noch Alternativen?
Du koenntest den spiess umdrehen und Deine implementierung als »Behavior«,
als eine art »Interface« schreiben - also zuerst ein array-objekt erzeugen,
um dieses im nachhinein mit zusaetzlichem verhalten anzureichern:
~~~javascript
var SDKSliceBehavior = (function () { // *interface* : [SDKSliceBehavior]
this.sdkSlice = (function () { /*
code according to [this]
*/
});
});
var arr01 = [8, 17, 26, 35, 44, 53, 62, 71, 80];
var arr02 = [8, 17, 26, 35, 44, 53, 62, 71, 80];
SDKSliceBehavior.call(arr02); // applying the *interface*
alert(arr01.sdkSlice); // undefined
alert(arr02.sdkSlice); // function () { ... }
MfG Hase
so long - peterS. - pseliger@gmx.net
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]