> I'm not sure I understand how these 2 are identical. Former one is a
> constructor function (with properties like "prototype", "subclasses",
> "superclass"), while latter one is a "prototype" object (with all the
> shared "instance" methods).

I guess my point is not that they are identical, but whether I copy
methods to my instance from an instance of another class, or directly
from it's prototype I end up with the same result.

Thanks for your code example, it looks like a sensible way of doing
things and I'll be sure to explore it further.


On Apr 25, 6:32 pm, kangax <[EMAIL PROTECTED]> wrote:
> I'm not sure I understand how these 2 are identical. Former one is a
> constructor function (with properties like "prototype", "subclasses",
> "superclass"), while latter one is a "prototype" object (with all the
> shared "instance" methods).
>
> As far as mixins and inheritance, I would do something like this:
>
> var Predator = Class.create({
>   hunt: function() {
>     return this.name + ' is hunting';
>   }
>
> });
>
> var WaterPredator = Class.create(Predator, {
>   hunt: function($super) {
>     return $super() + ' under water';
>   }
>
> })
>
> var Shark = Class.create({
>   initialize : function(name) {
>     this.name = name;
>   },
>   speak: function(msg) {
>     return this.name + ': ' + msg;
>   }
>
> })
>
> // Create a temporary class and blend both prototypes in:
> var MixedIn = Class.create(WaterPredator, Shark.prototype);
>
> new MixedIn('Sharkie').name; // "Sharkie"
> new MixedIn('Sharkie').speak('Hello underwater world'); // "Sharkie:
> Hello underwater world"
> new MixedIn('Sharkie').hunt(); // "Sharkie is hunting under water"
>
> Best,
> kangax
>
> On Apr 25, 7:06 am, Mike Rumble <[EMAIL PROTECTED]> wrote:
>
> > > I don't see how "var d = new A(B); " is "chunkier" than "var e = new
> > > A(new (B));" : )
>
> > I guess it's a matter of taste then. I prefer Object.extend(this, obj)
> > to Object.extend(this, obj.prototype), just wanted to know if there
> > was really any difference in the two different approaches, and for the
> > record both function identically.
>
> > > Am I correct that you want to extend instance with methods, and
> > > preserve their (methods') inheritance?
>
> > Yeah that's spot on.
>
> > On Apr 23, 10:53 pm, kangax <[EMAIL PROTECTED]> wrote:
>
> > > Am I correct that you want to extend instance with methods, and
> > > preserve their (methods') inheritance?
>
> > > - kangax
>
> > > On Apr 23, 7:22 am, Mike Rumble <[EMAIL PROTECTED]> wrote:
>
> > > > Hello,
>
> > > > I can't make my mind up over some finer points of an API design and
> > > > would appreciate any feedback on my code. Hopefully this example is
> > > > clear...
>
> > > > var A = Class.create({
> > > >   initialize : function(obj){
> > > >     Object.extend(this, obj)
> > > >   }
>
> > > > });
>
> > > > var B = {
> > > >   method : function(){
> > > >     ....
> > > >   }
>
> > > > };
>
> > > > var C = {
> > > >   method: function(){
> > > >     ....
> > > >   }
>
> > > > };
>
> > > > var d = new A(B);
> > > > var e = new A(C);
>
> > > > On initialization each instance of class A is extended with methods
> > > > from a separate object via Object.extend. I've chosen not to use
> > > > Class#addMethods because each instance of can be extended with a
> > > > different object, and therefore the prototype chain of class A should
> > > > remain unaffected.
>
> > > > So for so good.
>
> > > > However I'm looking to use this taking advantage of Prototype's
> > > > inheritance features for the extension objects. I've currently got
> > > > something that looks like this...
>
> > > > var A = Class.create({
> > > >   initialize : function(obj){
> > > >     Object.extend(this, obj.prototype)
> > > >   }
>
> > > > });
>
> > > > var B = Class.create({
> > > >   method : function(){
> > > >     ....
> > > >   }
>
> > > > })
>
> > > > var C = (B, {
> > > >   method: function($super){
> > > >     $super();
> > > >   }
>
> > > > };
>
> > > > var d = new A(B);
> > > > var e = new A(C);
>
> > > > It works OK but feels a little clunky. To me it would make more sense
> > > > to do something like this...
>
> > > > var A = Class.create({
> > > >   initialize : function(obj){
> > > >     Object.extend(this, obj)
> > > >   }
>
> > > > });
>
> > > > var B = Class.create({
> > > >   method : function(){
> > > >     ....
> > > >   }
>
> > > > })
>
> > > > var C = (B, {
> > > >   method: function($super){
> > > >     $super();
> > > >   }
>
> > > > };
>
> > > > var d = new A(new (B));
> > > > var e = new A(new (C));
>
> > > > Anybody got any strong opinions on which approach is best?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Spinoffs" group.
To post to this group, send email to rubyonrails-spinoffs@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-spinoffs?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to