[Proto-Scripty] Re: mixin of function not found

2009-07-14 Thread ronman

OK on using addMethods.  Makes sense, and it's working for me.  Very
nice. Thanks.

About not assigning functions after creation without a good factory
method, I'm confused.  Isn't that what the example is doing on the
Prototype example at:  http://prototypejs.org/learn/class-inheritance
?

// define a module
var Vulnerable = {
  wound: function(hp) {
this.health -= hp;
if (this.health  0) this.kill();
  },
  kill: function() {
this.dead = true;
  }
};

// the first argument isn't a class object, so there is no
inheritance ...
// simply mix in all the arguments as methods:
var Person = Class.create(Vulnerable, {
  initialize: function() {
this.health = 100;
this.dead = false;
  }
});

var bruce = new Person;
bruce.wound(55);
bruce.health; //- 45




On Jul 13, 4:22 pm, Matt Foster mattfoste...@gmail.com wrote:
 The second argument is accepting attributes of the HTML element.  It
 isn't just assigning values to the object like Object.extend style.

 I'd recommend using Element.addMethods, and scope it to only canvas
 elements, that way each time you create a canvas you'll have this
 method available, but it won't pollute other elements with this
 special functionality.
 Element.addMethods('canvas', ...);

 http://prototypejs.org/api/element/addMethods

 You could also assign the function value after creation, but unless
 you're using a good factory pattern, you could easily get instances of
 canvas without your specialized method.  You can't send methods to the
 constructor like that, just won't work.  The declaration for Element
 is a bit bizarre so it can be hard to find, so here it is...

 (function() {
   var element = this.Element;
   this.Element = function(tagName, attributes) {
     attributes = attributes || { };
     tagName = tagName.toLowerCase();
     var cache = Element.cache;
     if (Prototype.Browser.IE  attributes.name) {
       tagName = '' + tagName + ' name=' + attributes.name + '';
       delete attributes.name;
       return Element.writeAttribute(document.createElement(tagName),
 attributes);
     }
     if (!cache[tagName]) cache[tagName] = Element.extend
 (document.createElement(tagName));
     return Element.writeAttribute(cache[tagName].cloneNode(false),
 attributes);
   };
   Object.extend(this.Element, element || { });
   if (element) this.Element.prototype = element.prototype;

 }).call(window);

 --

 http://positionabsolute.net

 On Jul 13, 2:40 pm, ronman ron.new...@gmail.com wrote:

  Why doesn't 'getCoordinates' show up in the following code?
  canvas.getCoordinates() throws an error of getCoordinates is not a
  function

  I'm making a newbie error somewhere.

      var canvas = new Element('canvas', {
        width:  this.xform(data.size[0]) + 16 + 'px',
        height: this.xform(data.size[1]) + 16 + 'px',

        // mixin to Element for canvases
        getCoordinates: function(element){
          var position = this.getPosition(element), size = this.getSize
  ();
          var obj = {left: position.x, top: position.y, width: size.x,
  height: size.y};
          obj.right = obj.left + obj.width;
          obj.bottom = obj.top + obj.height;
          return obj;
        },
      }
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Prototype  script.aculo.us group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~--~~~~--~~--~--~---



[Proto-Scripty] Re: mixin of function not found

2009-07-14 Thread Matt Foster

Factory pattern in a nutshell is using the same source for all
creation of a particular class, such that all instances can be
prepared identically.
The source being a method, probably a member of a class, you always
reference this method to create a new instance instead of calling new
Class directly in your implementation.  The advantage of this is that
when your implementation wants all instances to have a particular
property set you can set it in this central method before it gets
returned instead of having to run around your code and find everytime
you instantiated it.  Or even better, the factory method returns a
subclass that has this property/function already built in.

http://en.wikipedia.org/wiki/Factory_method_pattern

Element is not an instance nor does it a extend from Class/
Class.create so you can't swap this sort of functionality.

The following will not work as you're anticipating.

var CanvasElement = Class.create(Element, {
  myMethod : function(){
//
  }
});
var myCanvas = new CanvasElement();

myCanvas.myMethod(); //fail

--

http://positionabsolute.net


On Jul 14, 12:26 pm, ronman ron.new...@gmail.com wrote:
 OK on using addMethods.  Makes sense, and it's working for me.  Very
 nice. Thanks.

 About not assigning functions after creation without a good factory
 method, I'm confused.  Isn't that what the example is doing on the
 Prototype example at:  http://prototypejs.org/learn/class-inheritance
 ?

 // define a module
 var Vulnerable = {
   wound: function(hp) {
     this.health -= hp;
     if (this.health  0) this.kill();
   },
   kill: function() {
     this.dead = true;
   }

 };

 // the first argument isn't a class object, so there is no
 inheritance ...
 // simply mix in all the arguments as methods:
 var Person = Class.create(Vulnerable, {
   initialize: function() {
     this.health = 100;
     this.dead = false;
   }

 });

 var bruce = new Person;
 bruce.wound(55);
 bruce.health; //- 45

 On Jul 13, 4:22 pm, Matt Foster mattfoste...@gmail.com wrote:

  The second argument is accepting attributes of the HTML element.  It
  isn't just assigning values to the object like Object.extend style.

  I'd recommend using Element.addMethods, and scope it to only canvas
  elements, that way each time you create a canvas you'll have this
  method available, but it won't pollute other elements with this
  special functionality.
  Element.addMethods('canvas', ...);

 http://prototypejs.org/api/element/addMethods

  You could also assign the function value after creation, but unless
  you're using a good factory pattern, you could easily get instances of
  canvas without your specialized method.  You can't send methods to the
  constructor like that, just won't work.  The declaration for Element
  is a bit bizarre so it can be hard to find, so here it is...

  (function() {
    var element = this.Element;
    this.Element = function(tagName, attributes) {
      attributes = attributes || { };
      tagName = tagName.toLowerCase();
      var cache = Element.cache;
      if (Prototype.Browser.IE  attributes.name) {
        tagName = '' + tagName + ' name=' + attributes.name + '';
        delete attributes.name;
        return Element.writeAttribute(document.createElement(tagName),
  attributes);
      }
      if (!cache[tagName]) cache[tagName] = Element.extend
  (document.createElement(tagName));
      return Element.writeAttribute(cache[tagName].cloneNode(false),
  attributes);
    };
    Object.extend(this.Element, element || { });
    if (element) this.Element.prototype = element.prototype;

  }).call(window);

  --

 http://positionabsolute.net

  On Jul 13, 2:40 pm, ronman ron.new...@gmail.com wrote:

   Why doesn't 'getCoordinates' show up in the following code?
   canvas.getCoordinates() throws an error of getCoordinates is not a
   function

   I'm making a newbie error somewhere.

       var canvas = new Element('canvas', {
         width:  this.xform(data.size[0]) + 16 + 'px',
         height: this.xform(data.size[1]) + 16 + 'px',

         // mixin to Element for canvases
         getCoordinates: function(element){
           var position = this.getPosition(element), size = this.getSize
   ();
           var obj = {left: position.x, top: position.y, width: size.x,
   height: size.y};
           obj.right = obj.left + obj.width;
           obj.bottom = obj.top + obj.height;
           return obj;
         },
       }
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Prototype  script.aculo.us group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~--~~~~--~~--~--~---