Toon posts:

[js] nieuw class afgeleid van Array

Pagina: 1
Acties:
  • 219 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil graag een class maken die een uitbreiding wordt op Array (het gaat namelijk om vectors en daar wil ik wat extra functies aan hangen)

Ik dacht dat dus zo te doen:
Java:
1
2
3
4
function Vector() {
  Array.apply(this, arguments);
}
Vector.prototype = new Array();


maar dat wil dus niet zo, ook iets als
Java:
1
 Array.constructor.apply(this, arguments);

ging helaas niet werken.

  • André
  • Registratie: Maart 2002
  • Laatst online: 14-04 13:30

André

Analytics dude

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function Vector() {
  return new Array();
}
Vector.prototype.apply = vectorApply

function vectorApply()
{
  this.apply(arguments)
}

function makeVector {
  return new Array()
}

Array.prototype.Vector = makeVector;

Lijn = new Vector();

Zo?

/Edit:
Nee, dat werkt ook niet.

[ Voor 63% gewijzigd door André op 27-01-2006 16:20 ]


  • André
  • Registratie: Maart 2002
  • Laatst online: 14-04 13:30

André

Analytics dude

Even wat lopen proberen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Array.prototype.Vector = new vectorObj;

function vectorObj() { }
vectorObj.prototype.test = vectorObjTest;

function vectorObjTest()
{
  this.waarde = "Test 2";
}

lijn = new Array();
lijn.Vector.test();

alert(lijn.Vector.waarde)

Daar moet je wel iets mee kunnen toch?

[ Voor 5% gewijzigd door André op 27-01-2006 16:33 ]


Verwijderd

Topicstarter
nou, ik wil graag Vector als apart object, dus niet als property van Array

Java:
1
2
3
4
5
6
7
8
9
10
Vector = Array;

Vector.prototype.multiplyBy = function(scalar) {
    l = this.length;
    for (var i=0; i<l; i++) {
        this[i]*=scalar;
    }
    return this;
}
// etc


dit werkt wel in firefox en geeft misschien wat duidelijker aan wat ik wil. IE slikt dit vooralsnog niet (valt me al mee dat fx het doet, normaal zou ik dit niet durven proberen eigenlijk)

[ Voor 3% gewijzigd door Verwijderd op 27-01-2006 16:37 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:40

crisp

Devver

Pixelated

Ik denk dat je gewoon een eigen object aan zal moeten maken en vervolgens met wat gefreubel de standaard methods en properties van Array zal moeten 'inheriten' als het ware; javascript is immers geen class-based taal, maar het is wel dusdanig flexibel dat het te simuleren is ;)
Wellicht helpt dit je verder op weg :)

Intentionally left blank


Verwijderd

Topicstarter
in mijn TS probeer ik ook de boel van Array te 'inheriten', op de (volgens mij) standaard manier, maar dat werkt nog niet

Ik ga het artikel eens lezen :)

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 13-04 10:40
Hier kan je ook wat leuke mogelijkheden vinden om te werken met objecten binnen JavaScript: [rml][ purisme] prototypes / OO in JavaScript *[/rml]

  • Copyman
  • Registratie: Januari 2001
  • Laatst online: 31-03 14:04

Copyman

Dode muis

Dit werkt wel:

Java:
1
2
3
4
5
6
7
8
9
10
11
function Vector()
{
    return new Array();
}

Array.prototype.size = function() { return this.length; }

var vect = new Vector();
vect[0] = "foo";
vect[1] = "bar";
alert(vect.size());

Maar ik denk niet dat dit is wat je zoekt, aangezien je nu gewoon de Array class uitbreidt met size(). Vector.prototype.[...] werkt nu uiteraard niet, aangezien je een object van type Array retourneert.

Nog maar even verder pielen. ;)

Zeer belangrijke informatie: Inventaris


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function Vector() {}
Vector.prototype = new Array();
Vector.prototype.toString = function() {
    var s = 'Vector[' + this.join(',') + ']';
    return s;
}
Vector.prototype.add = function(p_vector) {
    if (this.length != p_vector.length) throw 'Cannot add vectors with different lengths.';
    var result = new Vector();
    var n = this.length;
    for (var i = 0; i < n; i++) {
        result.push(this[i] + p_vector[i]);
    }
    return result;
}

var v1 = new Vector();
var v2 = new Vector();
v1.push(1, 2, 3);
v2.push(2, 4, 8);
var v3 = v1.add(v2);
alert(v3.toString())


Dit werkt. Alleen zie ik zo snel even niet hoe je hier de constructor van Array gebruikt in Vector, zodat je bijvoorbeeld var v1 = new Vector(1, 2, 3) kunt gebruiken. Misschien heb je daar toch de methode van Clay voor nodig of de methode die hier beschreven staat.

| Toen / Nu


Verwijderd

Topicstarter
even tussendoor, want ik ben er nog niet verder mee, maar voor de mensen die zich afvragen "wat moet je ermee"

http://www.rikkertkoppes.com/brain2.0/network/springs.html

fx en moz only, IE pakt bovengenoemde objectengebeuren dus niet.
edit: verrek, opera pikt dit ook :)

[ Voor 10% gewijzigd door Verwijderd op 28-01-2006 01:24 ]


Verwijderd

Topicstarter
zo, eventjes hier verder, want het is hetzelfde ding waar ik mee bezig ben, alleen een andere vraag, maar dan staat het gerelateerde iig bij elkaar

Ik wat ik nu heb gedaan met die vectors is eigenljk gewoon het array object uitgebreid met een andere naam. Het maakt toch geen zak uit of Array die extra methods ook bevat eigenlijk:
Java:
1
2
3
4
Vector = Array;
Vector.prototype.norm = function() {
// etc
}

dit werkt iig in moz, fx, ie en opera, dus is wel goed zo


Nieuw probleem: svg dom aanpassen in js
ik heb een simpele svg dom in een xhtml document embedded, een svg element met daarin een circle element. Dat werkt, zoals ik zou verwachten (in fx)

Nu voeg ik met js wet circle elementen toe en ga ik deze vervolgens animeren, net zoals in het html voorbeeld. Ik maak dus nieuwe elementen, voeg deze toe aan de dom en verwacht beweging.

niks, nada, tenminste, niet iets wat ik kan zien

Als ik in de actuele source kijk (via fx -> view partial source), zie ik wel mooi m'n nieuwe elelementen en ze "bewegen ook" (de cx en cy veranderen), alleen zie ik ze alleen niet getekend worden.

Zie ik hier iets simpels over het hoofd?

"teken" code:
Java:
1
2
3
4
5
6
7
8
Node.prototype.SVGdrawTo = function(canvas) {
    this.el = document.createElement('circle');
    this.el.setAttribute('r','10');
    this.el.setAttribute('cx',this.r[0]);
    this.el.setAttribute('cy',this.r[1]);
    this.el.setAttribute('stroke','black');
    canvas.canvasObject.appendChild(this.el);
}


testcase (zelfde als boven, maar nu met .php om het mime type even goed te knutselen)
http://www.rikkertkoppes.com/brain2.0/network/springs.php


edit:
volgens mij zit die nieuwe node in de verkeerde namespace...
namespaceURI retourneert iig de xhtml ns, createNode() werkt helaas niet in fx en createElement('SVG:circle') boeit ook geen fluit


edit2: eureka, gefixed
createElementNS() was de key, jammer dat dit heel slecht te vinden is, overal wordt gerefereerd aan de IE createNode() method :(

[ Voor 27% gewijzigd door Verwijderd op 31-01-2006 14:30 ]

Pagina: 1