ugrás a tartalomhoz

öröklődés object literallal

zzrek · 2010. Jan. 17. (V), 13.58
Sziasztok!

Object literal formában (kb JSON) kapom meg a szülőobjektumokat (vagy prototípusokat, osztályt, ahogy tetszik) és a gyerkőcöket is, amelyekben nem minden tulajdonság van felsorolva -- több szintet. pl:
  1. noveny={eheto:true// legmagasabb szint  
  2.   
  3. fenyo={parent:noveny,eheto:false,joekaracsonyfanak:true//2.szint  
  4. borovi={parent:fenyo,joekaracsonyfanak:true// 3. szint  
  5. luc={parent:fenyo}  
  6.   
  7. gyumolcs={parent:noveny,forma:"kerek", iz:"finom"}; //2.szint  
  8. alma={parent:gyumolcs}  // 3. szint  
  9. banan={parent:gyumolcs,forma:"hosszúkás"}  
  10. citrom={parent:gyumolcs, iz:"savanyú"}  
  11.   
  12. // itt kéne csinálni valamit  
  13.   
  14. alert(alma.eheto); // legyen true  
  15. alert(luc.eheto); //legyen false  
  16. // stb...  
  17.   
  18. //bónusz:  
  19. noveny.eheto=false;  
  20. alert(alma.eheto); // legyen false  
Nemnagyon találtam erre frappáns megoldást, hogyan szokás ilyesmit csinálni?
Köszönöm!
 
1

gyerek.extend(szülő)

inf · 2010. Jan. 17. (V), 20.06
  1. Object.prototype.each=function(method,scope)  
  2. {  
  3.     if (!scope)  
  4.     {  
  5.         scope=this;  
  6.     }  
  7.     for (var property in this)  
  8.     {  
  9.         var value=this[property];  
  10.         if (  
  11.             !(property in Object.prototype)  
  12.         ||  
  13.             value!==Object.prototype[property]  
  14.         )  
  15.         {  
  16.             method.call(scope,property,value);  
  17.         }  
  18.     }  
  19.     return scope;  
  20. };  
  21.   
  22. Object.prototype.extend=function(source)  
  23. {  
  24.     return source  
  25.         ?Object.prototype.each.call(source,function (property,value)  
  26.         {  
  27.             if (  
  28.                 !(property in this)  
  29.             ||  
  30.                 (  
  31.                     (property in Object.prototype)  
  32.                 &&  
  33.                     this[property]===Object.prototype[property]  
  34.                 )  
  35.             )  
  36.             {  
  37.                 this[property]=value;  
  38.             }  
  39.         },this)  
  40.         :this;  
  41. };  
2

Köszönöm

zzrek · 2010. Jan. 17. (V), 22.22
Köszönöm, szép is, jó is a kód, én is gondoltam olyasmire, hogy ami nincs benne a gyerekben azt másoljuk le a szülőtől, de lássuk be hogy ez azért nem az igazi...

A prototype alapú öröklődést próbáltam ráhekkelni az object literalra, de nem ment elsőre; ezek szerint nem is lehet?

Még gondolkodom a dolgon... Csak a legmodernebb böngészők alatt kell, hogy működőképes legyen (IE8, FF3.5, esetleg a legújabb Chrome); a Firefoxnak van mindenféle cseles metódusa/tulajdonsága, amikkel lehet variálni, de bele sem kezdek, ha IE8 alatt úgyse menne. (Még utána kéne néznem az IE "rejtett" képességeinek előbb)
3

Miért?

inf · 2010. Jan. 18. (H), 00.05
Miért ne lenne az igazi? :-) Ez a módja.

Esetleg még lehet írni get/set függvényeket, amik ha nem találják az adott tulajdonságot, akkor továbblépnek a szülőre.


Prototype alapú öröklődés osztályoknál van, a literal viszont csak Object osztályhoz tartozó példányokat ad.
4

Nem tudom miért :-)

zzrek · 2010. Jan. 18. (H), 00.29
... de talán a fő indok, hogy így minden olyan tulajdonság is megsokszorozódik, amik a felmenőkben vannak definiálva (ugye a prototype alapúnál ez nem így van?). (Meg ha nem lenne muszáj, nem szaladnék végig ciklusokkal mindenfélén)

Próbáltam valahogy az Objectből Functiont faragni vagy egyéb egyszerű módon megértetni a böngészővel hogy mit akarok, de nem ment. Ahogy utánanéztem, másnak sem :-(

Olyat találtam, amiben kreáltak egy konstruktorfüggvényt és a literált "átkonvertálták" this-ekké. Hát ha más nincs... De azért ez sem az igazi.

Pl:
classier json

Próbálgatom, próbálgatom.

"Esetleg még lehet írni get/set függvényeket..."
Én is gondoltam ilyenre is, de ezt nem csak a mozilla alapú böngészők tudják? (Márminthogy bizonyos tulajdonságok lekéréséhez get/set függvényt lehet rendelni. Mert persze minden tulajdonságot nem szeretnék eleve úgy lekérni, hogy objektum.get("x") )
Köszi!