Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 6723

Show
Ignore:
Timestamp:
05/12/07 04:32:30 (1 year ago)
Author:
sam
Message:

prototype: Refactor Element.extend and eliminate Element.extend.cache.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • spinoffs/prototype/trunk/CHANGELOG

    r6644 r6723  
    11*SVN* 
     2 
     3* Refactor Element.extend and eliminate Element.extend.cache.  [sam] 
    24 
    35* Add Function#curry, Function#delay, Function#defer, and Function#wrap.  Closes #8134.  [Andrew Dupont, Tobie Langel, sam] 
  • spinoffs/prototype/trunk/src/base.js

    r6644 r6723  
    101101      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));  
    102102    } 
     103  }, 
     104   
     105  methodize: function() { 
     106    if (this._methodized) return this._methodized; 
     107    var __method = this; 
     108    return this._methodized = function() { 
     109      return __method.apply(null, [this].concat($A(arguments))); 
     110    }; 
    103111  } 
    104112}); 
  • spinoffs/prototype/trunk/src/dom.js

    r6626 r6723  
    3939 
    4040if (!window.Element) var Element = {}; 
    41  
    42 Element.extend = function(element) { 
    43   var F = Prototype.BrowserFeatures; 
    44   if (!element || !element.tagName || element.nodeType == 3 ||  
    45    element._extended || F.SpecificElementExtensions || element == window)  
    46     return element; 
    47  
    48   var methods = {}, tagName = element.tagName, cache = Element.extend.cache,  
    49    T = Element.Methods.ByTag; 
    50  
    51   // extend methods for all tags (Safari doesn't need this) 
    52   if (!F.ElementExtensions) { 
    53     Object.extend(methods, Element.Methods),  
    54     Object.extend(methods, Element.Methods.Simulated);       
    55   } 
    56  
    57   // extend methods for specific tags 
    58   if (T[tagName]) Object.extend(methods, T[tagName]); 
    59  
    60   for (var property in methods) { 
    61     var value = methods[property]; 
    62     if (typeof value == 'function' && !(property in element)) 
    63       element[property] = cache.findOrStore(value); 
    64   } 
    65  
    66   element._extended = Prototype.emptyFunction; 
    67   return element; 
    68 }; 
    69  
    70 Element.extend.cache = { 
    71   findOrStore: function(value) { 
    72     return this[value] = this[value] || function() { 
    73       return value.apply(null, [this].concat($A(arguments))); 
    74     } 
    75   } 
    76 }; 
    7741 
    7842Element.Methods = { 
     
    573537Object.extend(Element, Element.Methods); 
    574538 
     539Element.extend = (function() { 
     540  if (Prototype.BrowserFeatures.SpecificElementExtensions) 
     541    return Prototype.K; 
     542   
     543  var Methods = {}, ByTag = Element.Methods.ByTag; 
     544   
     545  var extend = Object.extend(function(element) { 
     546    if (!element || element._extendedByPrototype ||  
     547        element.nodeType != 1 || element == window) return element; 
     548 
     549    var methods = Object.clone(Methods), 
     550      tagName = element.tagName, property, value; 
     551     
     552    // extend methods for specific tags 
     553    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); 
     554     
     555    for (property in methods) { 
     556      value = methods[property]; 
     557      if (typeof value == 'function' && !(property in element)) 
     558        element[property] = value.methodize(); 
     559    } 
     560     
     561    element._extendedByPrototype = Prototype.emptyFunction; 
     562    return element; 
     563     
     564  }, {  
     565    refresh: function() { 
     566      // extend methods for all tags (Safari doesn't need this) 
     567      if (!Prototype.BrowserFeatures.ElementExtensions) { 
     568        Object.extend(Methods, Element.Methods); 
     569        Object.extend(Methods, Element.Methods.Simulated); 
     570      } 
     571    } 
     572  }); 
     573   
     574  extend.refresh(); 
     575  return extend; 
     576})(); 
     577 
    575578if (!Prototype.BrowserFeatures.ElementExtensions &&  
    576  document.createElement('div').__proto__) { 
     579    document.createElement('div').__proto__) { 
    577580  window.HTMLElement = {}; 
    578581  window.HTMLElement.prototype = document.createElement('div').__proto__; 
     
    619622  function copy(methods, destination, onlyIfAbsent) { 
    620623    onlyIfAbsent = onlyIfAbsent || false; 
    621     var cache = Element.extend.cache; 
    622624    for (var property in methods) { 
    623625      var value = methods[property]; 
     626      if (typeof value != 'function') continue; 
    624627      if (!onlyIfAbsent || !(property in destination)) 
    625         destination[property] = cache.findOrStore(value); 
     628        destination[property] = value.methodize(); 
    626629    } 
    627630  } 
     
    667670  Object.extend(Element, Element.Methods); 
    668671  delete Element.ByTag; 
     672   
     673  if (Element.extend.refresh) Element.extend.refresh(); 
    669674}; 
    670675 
  • spinoffs/prototype/trunk/test/unit/base.html

    r6626 r6723  
    135135        assert(window.deferred); 
    136136      }); 
     137    }}, 
     138     
     139    testFunctionMethodize: function() { with(this) { 
     140      var Foo = { bar: function(baz) { return baz } }; 
     141      var baz = { quux: Foo.bar.methodize() }; 
     142       
     143      assertEqual(Foo.bar.methodize(), baz.quux); 
     144      assertEqual(baz, Foo.bar(baz)); 
     145      assertEqual(baz, baz.quux()); 
    137146    }}, 
    138147 
  • spinoffs/prototype/trunk/test/unit/form.html

    r6602 r6723  
    346346      Element.addMethods('SELECT', { aSelectMethod: function(select) { return 'select' } }); 
    347347 
    348       document.getElementById('tf_text')._extended = false; 
    349       document.getElementById('tf_selectOne')._extended = false; 
     348      document.getElementById('tf_text')._extendedByPrototype = false; 
     349      document.getElementById('tf_selectOne')._extendedByPrototype = false; 
    350350 
    351351      assert($('tf_text').anInputMethod);