Konstruktornak argumentumok átadása
Helló guruk!
Kis segítség kéne a következőben: Van nekem egy konstruktor függvényem ami így fest:A működés kb. annyi mint egyéb libekben, a konstruktor meghivja a
■ Kis segítség kéne a következőben: Van nekem egy konstruktor függvényem ami így fest:
result = function() {
var c = this;
if (c.constructor != arguments.callee) {
c = new arguments.callee();
}
return c.initialize.apply(c, arguments);
};
initialize metódust aminek átadja az argumentumokat. A kódot úgy szerveztem hogy ne keljen a new szóval kezdeni a példányosítást, és a probléma evvel függ össze: amikor a feltételben példányosítom az argument.callee függvényt hogy a this a helyén legyen, ott van mód arra hogy argumentumokat adjak át valahogy az arguments tömbből? Jelenleg az a problémám, hogy így kétszer fut le az initialize.




Problémák
arguments.callee-t használni, inkább adj nevet a függvényednek. Másodsorban mivel anew-nak nem lehet átadni tudtommal változó paramétereket, ezért meggondolnám eleve, hogy jó ötlet-e. Másik dolog, ha valami egy konstruktor, akkor nagy betűvel kezdjük, ha nem az, akkor meg kicsivel.initializeazért fut le kétszer, mert ha nemEntitytípusú a this, akkor létrehozol egy új elemet (ami meg fogja hívni azinitialize-t), majd, mivel nem tértél vissza az eredeti függvényből, újból meg lesz hívva.Másik megközelítés lehet, hogy teljes mértékben elfelejted a
newoperátort, és helyette azObject.createszintaxist használod.Tudom, hogy nem illik majd
resultegy összetett függvénynek az eredménye amit a végén vissza küldök és kötök egy változóhoz ami már terméseztessen nagy betűvel kezdődik. Nem másoltam be az egész kódot, a lényeg van egy függvényem ami kap változó hosszúságú paramétert, át konvertálom a arguments tömböt Array típusú tömbbé. De inkább mutatom:Úgy tudom (de javíts ki ha nem jól), hogy a
Object.createaz EcmaScript 5-től elérhető, bár az ötlet jó, lehet egy sima prototype másolás is megteszi ezt most mindjárt ki próbálom köszi.folyt.: végül ezt csináltam:
Kész megrogytam!
newoperátort használva egy konstruktor vissza tér valamilyen értékkel akkor kifejezés értéke az lesz nem pedig egy új objektum. Nekem atwováltozó nem egy szám hanem aClassegy példánya. Mit nem veszek észre?Én azt nem értem, hogy mit nem értesz. :)
Egy new operátor nem fog számot visszaadni, akárhogy csavarod, akkor sem. Tehát az első esetben hiába van a 8. sorban egy szám visszatérő érték, az felül lesz írva, mivel primitív értékkel térne vissza.
Lecserélheted azt a sort az alábbi verzióra:
Bár megjegyzem, hogy nagyon rossz irány az, hogy a new operátort opcionálissá teszed. De ez csak az én személyes véleményem. :)
Köszönöm, ez az amit nem
instanceof
instanceofoperátorral, miért nem használod az Object.create-et?Ha
newoperátorral hívsz meg egy függvényt, akkor az mindenképpen egy objektumot fog visszaadni, és a primitív szám nem objektum, maximum ha belecsomagolod egyNumber-be (return new Number(arguments.length)).Az Object.create szintaxis-t
Object.createszintaxis-t azért nem használom mert IE nem szereti az újításokat, és ez 6-7-8-ban nem működne, bár kb ugyan ezt csináltam amit most te, azinstanceofoperátorral meg az a bajom hogy ha athisvéletlenül nem a közvetlen példánya aClassosztálynak hanem mondjuk annak kiterjesztésének példánya akkor az gubanc.Jól működik
Object.createjól működik IE alatt is, habár csak 7-8-9-ben próbáltam. Azinstanceofpedig a leszármazottakra is igazat ad vissza (IE-ben is.)