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:

noveny={eheto:true} // legmagasabb szint

fenyo={parent:noveny,eheto:false,joekaracsonyfanak:true} //2.szint
borovi={parent:fenyo,joekaracsonyfanak:true} // 3. szint
luc={parent:fenyo}

gyumolcs={parent:noveny,forma:"kerek", iz:"finom"}; //2.szint
alma={parent:gyumolcs}  // 3. szint
banan={parent:gyumolcs,forma:"hosszúkás"}
citrom={parent:gyumolcs, iz:"savanyú"}

// itt kéne csinálni valamit

alert(alma.eheto); // legyen true
alert(luc.eheto); //legyen false
// stb...

//bónusz:
noveny.eheto=false;
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

	Object.prototype.each=function(method,scope)
	{
		if (!scope)
		{
			scope=this;
		}
		for (var property in this)
		{
			var value=this[property];
			if (
				!(property in Object.prototype)
			||
				value!==Object.prototype[property]
			)
			{
				method.call(scope,property,value);
			}
		}
		return scope;
	};

	Object.prototype.extend=function(source)
	{
		return source
			?Object.prototype.each.call(source,function (property,value)
			{
				if (
					!(property in this)
				||
					(
						(property in Object.prototype)
					&&
						this[property]===Object.prototype[property]
					)
				)
				{
					this[property]=value;
				}
			},this)
			:this;
	};
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!