peterS.: die dienstverweigerung von array-objekten als direkte basistypen

Beitrag lesen

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:]