ugrás a tartalomhoz

Javascript és az öröklődés

inf · 2007. Szep. 7. (P), 14.50
Üdv.

javascriptben úgy oldottam meg az öröklődést, hogy:

function szülő(a,b,c)
{
 this.source=[a,b,c];
}

var gyerek=szülő.extend(function (a,b,c,d)
{
 this.source=[a,b,c,d];
})
na most ez annyi, hogy beleírtam a Function.prototype-ba egy extend függvényt

mindez eddig szép és jó, még azt is beleírtam, hogy a prototypeját a szülőnek másolja le a gyerek prototypejába, meg hogy a gyereknek is lehessen plussz tulajdonságokat hozzáadni a prototypehoz egy object megadásával az extend függvényben..

szóval bővítsük kicsit a dolgot, most a szülő a Range a gyerek pedig a Form:

function Range()
{
 this.source=Array.from(arguments);
}

Range.prototype.contract=function (filter)
{
 var results=new this.constructor;
 for (var i=0; i<this.source.length; i++)
 {
  if (filter.call(this,this[i]))
  {
   results.push(this[i]);
  }
 });
 return results;
}

var Form=Range.extend(function (form)
{
 this.form=form;
 this.source=Array.from(form.elements);
},
{
 disable:function ()
 {
  for (var i=0; i<this.source.length; i++)
  {
   this.source[i].setAttribute("disabled",true);
  }
 },
 header:function (mime)
 {
  this.form.encoding=mime;
 }
});
na most itt a Range egy interface az Arrayra, és azért jó, mert ezt tovább lehet örökíteni, az Arrayt viszont elég nehézkes, mivelhogy nem saját függvény, a prototypejában levő függvények sem másolhatóak stb..

a Rangenek a contract függvénye annyit tesz, hogy egy új objectbe másolja be a filter függvénynek megfelelő értékeket.

a Form egy interface a HTML FORM objectre, és mellesleg a Range kiterjesztése, szóval a Form source tulajdonsága egy tömb az adott formban levő inputokról

na ha ez így világos, akkor vázolom a problémát:

ha meghívom a contract függvényt, akkor egy új Form objectet kapok, aminek az elemei a filter által jónak talált elemek, mondjuk legyenek csak a gombok:

var gombok=new Form(form).contract(function (input)
{
 return input.type=="button"?true:false;
})
na most a contract által visszaadott Form object annyiból hibás, hogy a Rangeben a

new this.constructorral;
lett meghívva, ami pedig azért nem nyerő, mert egyrészt kiesik a header függvény, ami a form mime typeját állítja (nem véletlenül írtam bele a példába), másrészt meg hibaüzi jön.. szóval amit kapunk az csak egy gyűjtemény lesz, a Form tulajdonságai elvesznek, én pedig azt szeretném, hogy megmaradjanak, magyarul a másolatban a .form tulajdonsághoz valahogy be kéne rakni az eredeti form objectet.
Na erre keresek egy általános megoldást, aki felfogta, hogy miről van szó, és tud ilyet, vagy vannak ötletei, az kérem írjon, köszi!
 
1

Hiba

inf · 2007. Szep. 8. (Szo), 03.39
Elnézést, itt:

results.push(this[i]);
elhibáztam, az igazából

results.source.push(this[i]);
2

megoldás

inf · 2007. Szep. 8. (Szo), 11.38
Közben megoldottam, írtam egy függvényt, ami új objectet hoz létre, és pointerezi a régiből a construct alatt létrehozott dolgokat. Ennek a függvénynek lehet kivételt adni, és a megadott kivételt nem pointerezi, hanem létrehoz egy a kivétel típusának megfelelő objectet - már ha van konstruktora a kivételnek, és nem mondjuk html element stb...