|
From: Leif W <war...@us...> - 2002-12-22 15:23:34
|
Below is a simplified version of the relevent bits of my code which
demonstrates the problem more clearly.
Here's a summarization of the code:
* Pile and Deck object definitions. Deck inherits from Pile, and extends
with Populate method.
* onLoad, a function initializes some variables whose values are form
elements.
* click the init button, initialize two decks (deck1 and deck2).
* click the populate button, populate deck1 only.
* click the display button, shows deck1 and deck2 have been populated.
Things to note:
* the Name property of Pile is correctly holding two different values for
each instance of Deck.
* the Cards array property is incorrectly holding a reference to the same
array.
<HTML>
<HEAD>
<TITLE>Uno Card Game Prototype</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<SCRIPT LANGUAGE="JavaScript">
<!--
Pile = function ( )
{
this.Name = '';
this.Cards = new Array( );
this.displayObj = new Object( );
};
Pile.prototype.init = function ( name , displayObj )
{
this.setName( name );
this.setDisplayObj( displayObj );
};
Pile.prototype.setName = function ( name )
{
this.Name = name;
};
Pile.prototype.getName = function ( )
{
return( this.Name );
};
Pile.prototype.setDisplayObj = function ( displayObj )
{
this.displayObj = displayObj;
};
Pile.prototype.getDisplayObj = function ( )
{
return( this.displayObj );
};
Pile.prototype.getNumCards = function ( )
{
return( this.Cards.length );
};
Pile.prototype.Display = function ( )
{
var numCards = this.getNumCards( );
var msg = 'Deck: ' + this.getName( ) + '(' + numCards + ' cards)\n';
for ( var i = 0 ; i < numCards ; i++ )
{
msg += i + ': ' + this.Cards[i] + '\n';
}
this.getDisplayObj( ).value = msg;
};
Deck = new Function( );
Deck.prototype = new Pile( );
Deck.prototype.Populate = function ( )
{
var colors = new Array( 'red' , 'orn' , 'ylw' , 'grn' , 'blu' , 'vlt' );
for ( var i = 0 ; i < colors.length ; i++ )
{
this.Cards[i] = colors[i];
}
};
var deck1 = new Object( );
var deck2 = new Object( );
var deck1LogObj = new Object( );
var deck2LogObj = new Object( );
var activityLogObj = new Object( );
var initFlag = false;
function test_global_init ( )
{
deck1 = new Object( );
deck2 = new Object( );
deck1LogObj = document.forms[ 'table' ].deck1_log;
deck2LogObj = document.forms[ 'table' ].deck2_log;
activityLogObj = document.forms[ 'table' ].activity_log;
};
function test_deck_init ( )
{
if ( initFlag == false )
{
deck1 = new Deck( );
deck2 = new Deck( );
deck1.init( 'Deck One' , deck1LogObj );
deck2.init( 'Deck Two' , deck2LogObj );
activityLogObj.value = 'deck1 (' + deck1.getName( ) + ') and ' +
'deck2 (' + deck2.getName( ) + ')
initialized.\n';
initFlag = true;
}
else
{
activityLogObj.value += 'Decks already initialized.\n';
}
};
function test_deck_populate ( )
{
deck1.Populate( );
activityLogObj.value += deck1.getName( ) + ' populated.\n';
};
function test_deck_display ( )
{
deck1.Display( );
deck2.Display( );
activityLogObj.value += 'Decks displayed.\n';
};
function test_deck_clear ( )
{
deck1LogObj.value = '';
deck2LogObj.value = '';
activityLogObj.value = '';
};
//-->
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#000000" TEXT="#FFFFFF" LINK="#00FF00" ALINK="#FF0000"
VLINK="#990000" TOPMARGIN="5" BOTTOMMARGIN="5" LEFTMARGIN="5"
RIGHTMARGIN="5" MARGINHEIGHT="5" MARGINWIDTH="5"
onLoad="test_global_init( );">
<FORM NAME="table" METHOD="post" ACTION="" onSubmit="return( false );">
<TABLE BGCOLOR="#FF00FF" BORDER="0" CELLPADDING="0" CELLSPACING="2">
<TR>
<TD>
<TABLE BGCOLOR="#000000" BORDER="0" CELLPADDING="0" CELLSPACING="5">
<TR>
<TD><FONT SIZE="2" FACE="Verdana, Arial">
<INPUT TYPE="button" NAME="deck_init_test" VALUE="init"
onClick="test_deck_init( );">
<INPUT TYPE="button" NAME="deck_populate_test"
VALUE="populate" onClick="test_deck_populate( );">
<INPUT TYPE="button" NAME="deck_display_test" VALUE="display"
onClick="test_deck_display( );">
<INPUT TYPE="button" NAME="deck_clear_test" VALUE="clear"
onClick="test_deck_clear( );">
<BR>
<TEXTAREA NAME="deck1_log" COLS="20" ROWS="10"
TYPE="virtual"></TEXTAREA>
<TEXTAREA NAME="deck2_log" COLS="20" ROWS="10"
TYPE="virtual"></TEXTAREA>
<BR>
<TEXTAREA NAME="activity_log" COLS="40" ROWS="10"
TYPE="virtual"></TEXTAREA>
</FONT></TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
----- Original Message -----
From: "Leif W" <war...@us...>
To: <dyn...@li...>
Sent: Sunday, December 22, 2002 9:20 AM
Subject: [Dynapi-Chat] JavaScript secondary inheritance bug.
> Hello,
>
> I'm working with some JavaScript to create a card game, and have come
across
> the secondary inheritance bug (using IE 6.0.2800.1106 (SP1)), and was
> wondering if
> someone could explain the fix for the similar problem that was found in
the
> dynapi.
> Ideally an explanation or example of a generalized solution or workaround
> for this
> problem would be most helpful (as opposed to a DynAPI-centric solution).
>
> The scenario in my code, I have a Pile object, and a Deck object, and two
> instances of the Deck object. I have a Deck.Populate method which fills
the
> deck with cards. This method is called once from one instance, but both
> decks become populated. The Decks have a Name property which seems to be
> ok,
> but the methods apparently aren't inherited properly.
>
> My card game is in prototyping now, so that I can get the core game
working
> and modularized (for different card games), but I plan to make a DynAPI
> version, along with Java Applet, Flash, and PHP versions (from text-only
> standalone up to full GUI and client/server multiplayer). This isn't part
> of any corporate venture, it's solely for the purpose of self-education
and
> exercise.
>
> Any help would be appreciated.
>
> Sincerly,
>
> Leif W
> warp-9.9
>
>
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> Dynapi-Chat mailing list
> Dyn...@li...
> https://lists.sourceforge.net/lists/listinfo/dynapi-chat
>
|