That's almost exactly the polyfill for Object.create (except with some extra book keeping):
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

|if| |(!Object.create) {|
|||Object.create = ||function| |(o) {|
|||if| |(arguments.length > 1) {|
|||throw| |new| |Error(||'Object.create implementation only accepts the first parameter.'||);|
|||}|
|||function| |F() {}|
|||F.prototype = o;|
|||return| |new| |F();|
|||};|
|}

// classic inheritance works from Object.create without any glue code at all
ChildClass.prototype = Object.create( ParentClass.prototype );
|

You could rewrite the base.js version slightly, to take advantage of Object.create (if there's an advantage the native method), and still do the bookkeeping:

||
|apache.extend = function( child, parent ) {
   child.$super$ = parent.prototype;
   child.prototype = Object.create( parent.prototype );
   child.prototype.constructor = parent;
}|
|// fallback to base.js method if Object.create polyfill is undesired|
|if| |(!Object.create) {
  apache.extend = ||function( child, parent ) {
    function F() {};
    F.prototype = parent.prototype;
    child.$super$ = parent.prototype;
    child.prototype = new F();
    child.prototype.constructor = child;
  };
}
|

Object.create has other useful features too (that can't be polyfilled unfortunately) - it has a way to set properties enumerable, configurable, and writable and to define getters and setters. Having a mode to output to that might be pretty spiffy.

Kevin N.




Reply via email to