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.initialize
azért fut le kétszer, mert ha nemEntity
tí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
new
operátort, és helyette azObject.create
szintaxist használod.Tudom, hogy nem illik majd
result
egy ö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.create
az 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!
new
operátort használva egy konstruktor vissza tér valamilyen értékkel akkor kifejezés értéke az lesz nem pedig egy új objektum. Nekem atwo
változó nem egy szám hanem aClass
egy 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
instanceof
operátorral, miért nem használod az Object.create-et?Ha
new
operá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.create
szintaxis-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, azinstanceof
operátorral meg az a bajom hogy ha athis
véletlenül nem a közvetlen példánya aClass
osztálynak hanem mondjuk annak kiterjesztésének példánya akkor az gubanc.Jól működik
Object.create
jól működik IE alatt is, habár csak 7-8-9-ben próbáltam. Azinstanceof
pedig a leszármazottakra is igazat ad vissza (IE-ben is.)