Oh and sorry, didn't mean to ignore the other question...

The main support group is here:
http://groups.google.ca/group/rubyonrails-spinoffs


On 3/30/07, Ryan Gahl <[EMAIL PROTECTED]> wrote:
>
> You're really going the long way around to achieve something that's quite
> simple. See my last reply in this thread.
>
> On 3/30/07, Lorderon < [EMAIL PROTECTED]> wrote:
> >
> >
> > Hi,
> >
> > The point was to extend the original object with reference to the
> > parent object (the original object as before the extension), and
> > without creating a new class/object inherited from the original one.
> >
> > I solved my problem with this:
> >
> > addPlugin: function(pluginObj) {
> >         var $parent = Object.clone(this);
> >         for (var p in pluginObj) {
> >                 if (typeof(pluginObj[p])=='function')
> >                         pluginObj[p] = eval(pluginObj[p].toString());
> >         }
> >         Object.extend(this,pluginObj);
> > }
> >
> > Notice the addPlugin method defines the $parent object, then it re-
> > evaluates the methods in the extension object (pluginObj).
> > Wouldn't it better if you could access the parent via a special object
> > $parent.show() rather than making:
> > this.show.bind(this)();
> >
> > Where can I find the support forum?
> >
> > -thanks, Eli
> >
> >
> > On Mar 30, 4:52 pm, "Ryan Gahl" < [EMAIL PROTECTED]> wrote:
> > > However, you could employ a slightly more traditional approach, which
> > is to
> > > leave the first version of A as the base class, and then subclass it
> > as
> > > needed:
> > >
> > > (Btw, the way you have written A below is as a static object, and as
> > such
> > > you are gaining nothing by using Class.create(). Class.create() points
> > the
> > > constructor for the class at an "initialize" method on the class's
> > > prototype, which of course you never define)
> > >
> > > Try something like this (notice that I define public class level
> > instance
> > > methods within the constructor to ensure they are truly only given to
> > > instances of the class):
> > >
> > > var A = Class.create();
> > > A.prototype = {
> > > initialize: function() {
> > > //public instance members
> > > this.show = function() {
> > > alert("I am A");
> > >
> > > };
> > > }
> > > }
> > >
> > > var B = Class.create();
> > > Object.inherit(A, B);
> > > Object.extend(B.prototype, {
> > > initialize: function() {
> > > //base class construction
> > > this.base();
> > >
> > > //override show
> > > var oldShow = this.show.bind(this);
> > > this.show = function() {
> > > oldShow();
> > > alert("I am EXTENDED A");
> > >
> > > };
> > > }
> > > });
> > >
> > > var test = new B();
> > > B.show(); // alerts "I am A" and "I am EXTENDED A"
> > >
> > > This technique comes right from by blog post on the inheritance model.
> > >
> > > Now, if you're looking to tack (or override) methods on existing
> > > instances... you don't need a special addPlugin() method like what you
> > > started doing. You can just take advantage of plain old javascript...
> > >
> > > (Assume we are back to using the definition of A from your original
> > post)...
> > >
> > > var oldShow = A.show.bind(A);
> > > A.show = function() {
> > > oldShow();
> > > alert("I am EXTENDED A");
> > >
> > > };
> > >
> > > Notice in my first example (the object oriented approach), and in this
> >
> > > example (the static object version) I use a .bind() call. Doing so
> > ensures
> > > that if A.show() ever tried to access "this", it would still point to
> > the
> > > correct scope.
> > >
> > > For instance, imagine A.show() looked like this:
> > >
> > > function() {
> > > alert(this.name);
> > >
> > > }
> > >
> > > Ok... so I'll stop now I guess, just realize this list isn't really
> > supposed
> > > to be a support list. :-)
> > >
> > > Hope this has helped though.
> >
> >
> > > >
> >
>
>
> --
> Ryan Gahl
> Application Development Consultant
> Athena Group, Inc.
> Inquire: 1-920-955-1457
> Blog: http://www.someElement.com
>



-- 
Ryan Gahl
Application Development Consultant
Athena Group, Inc.
Inquire: 1-920-955-1457
Blog: http://www.someElement.com

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Prototype: Core" group.
To post to this group, send email to prototype-core@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/prototype-core?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to