On Thu, Jul 17, 2008 at 11:55 AM, Darren Houle <[EMAIL PROTECTED]> wrote:

>  Josh
>
> Yes, what you're describing is exactly what I described and is, in fact,
> what it happening... but to say I don't ever need to do this?  Well...
> yes... I need to do this... and it has nothing to do with the garbage
> collector.
>
> Here, let me explain in another way....
>
> I have a custom object... lets say it's a Person object.  It has various
> properties, but several are Date types.  These are all consecutive, like a
> workflow, and I want to be able to address them in order via an array...
> like this...
>
> var person : Person = new Person();
>
> person.wakeup = new Date();
> person.breakfast = new Date();
> person.lunch = new Date();
> person.dinner = null;
> person.bedtime = null;
>
> var timeArr : Array = new Array();
>
> timeArr[0] = person.wakeup;
> timeArr[1] = person.breakfast;
> timeArr[2] = person.lunch;
> timeArr[3] = person.dinner;
> timeArr[4] = person.bedtime;
>
>
> Then some other code figures out where we are in the flow of the day's
> events...
>
> var status : int;
> if (some criteria)
>       {  event = 2;  }
>
> But I determine lunch hasn't actually happened yet, so it shouldn't have a
> Date yet.  I need to blank out this value that was previously set in the
> Person object...
>
> if (some criteria)
>      {  timeArr[event] = null;  }
>
> But since these references don't seem to propogate backwards, nulling one
> of the array elements doesn't affect the original property.  That's the
> *whole purpose* of reference vs value... a reference is a pointer to memory
> space... so if I null that memory space it should affect all the vars
> pointing to that memory space.
>
> Does that make more sense?
>
> Darren
>
>
>
I think so. But you're definitely going about it the wrong way - hear me
out:

In ECMAScript, you can access any public field by indexing its name as a
string. Now assuming person has these fields, and you want to be able to
access them (and mess with them) in order. There's a few ways to do this:

const fieldOrder : Array =
  [
    'wakeup',
    'breakfast',
    'lunch',
    'dinner',
    'bedtime',
  ];

Then you can do this:

trace(myPerson.lunch); // == date.toString()

myPerson[fieldOrder[2]] = null;

trace(myPerson.lunch); // == null

But while you can mute that instance of date, you can't delete it. It
defeats the purpose of garbage collection (and probably makes it a lot
harder to implement).

If say, myPerson is *dynamic* either by the dynamic keyword on the class
definition, or because it's created with "{}" instead of "new ClassName()",
you can also do this

delete myPerson[fieldOrder[2]];

trace(myPerson.lunch); // === undefined, or an exception is thrown depending
on various conditions of myPerson :)

This will completely remove the "lunch" field from the myPerson instance,
but the Date instance itself will still be sitting around waiting for
garbage collection.

-Josh

-- 
"Therefore, send not to know For whom the bell tolls. It tolls for thee."

:: Josh 'G-Funk' McDonald
:: 0437 221 380 :: [EMAIL PROTECTED]

Reply via email to