0

I read John Resig's blog article on a Simple JavaScript Inheritance plugin that he wrote based on base2 and prototype.

Example code is here: http://jsfiddle.net/rFfX9/

//'use strict';

/* Simple JavaScript Inheritance
 * By John Resig http://ejohn.org/
 * MIT Licensed.
 */
// Inspired by base2 and Prototype
(function () {
  var initializing = false, fnTest = /xyz/.test(function () { xyz; }) ? /\b_super\b/ : /.*/;

  // The base Class implementation (does nothing)
  this.Class = function () { };

  // Create a new Class that inherits from this class
  Class.extend = function (prop) {
    var _super = this.prototype;

    // Instantiate a base class (but only create the instance,
    // don't run the init constructor)
    initializing = true;
    var prototype = new this();
    initializing = false;

    // Copy the properties over onto the new prototype
    for (var name in prop) {
      // Check if we're overwriting an existing function
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function (name, fn) {
          return function () {
            var tmp = this._super;

            // Add a new ._super() method that is the same method
            // but on the super-class
            this._super = _super[name];

            // The method only need to be bound temporarily, so we
            // remove it when we're done executing
            var ret = fn.apply(this, arguments);
            this._super = tmp;

            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }

    // The dummy class constructor
    function Class() {
      // All construction is actually done in the init method
      if (!initializing && this.init)
        this.init.apply(this, arguments);
    }

    // Populate our constructed prototype object
    Class.prototype = prototype;

    // Enforce the constructor to be what we expect
    Class.prototype.constructor = Class;

    // And make this class extendable
    Class.extend = arguments.callee;

    return Class;
  };
})();

This works. However when I uncomment 'use strict'; at the top it throws an exception, but can't figure out the solution. Any ideas?

Danil Speransky
  • 29,891
  • 5
  • 68
  • 79
Greg
  • 31,180
  • 18
  • 65
  • 85
  • The article is [here](http://ejohn.org/blog/simple-javascript-inheritance/) for those interested – Doug Feb 19 '13 at 09:46

1 Answers1

0

In this case when you call anonymous function this will be undefined you don't call the function as a method of an object. In not strict mode this will be window object.

See also: Why is "this" in an anonymous function undefined when using strict?

Community
  • 1
  • 1
Danil Speransky
  • 29,891
  • 5
  • 68
  • 79
  • This has nothing to do with anonymous or not, it's a matter of scope. – Christoph Feb 19 '13 at 09:27
  • You stated an anonymous function yields `this` undefined but actually when you see code like jquery you always hand over anonymous as callbacks which get executed in the according context by call or bind, so generally spoken your statement is false. It's a matter of **invocation** not if the function is anonymous or not. – Christoph Feb 19 '13 at 09:50
  • What you mean is an Immediately Invoked Function Expression invoked in the global execution context which by accident is also an anonymous function. [Named function with `this` == undefined](http://jsfiddle.net/2xLTH/1/) – Christoph Feb 19 '13 at 09:52
  • You are completely right. I just wanted to stress the point that it does not matter if the function is anonymous or not but rather the method of execution. This is the point of much confusion. A very good example is also the fiddle in the comment of your linked answer. – Christoph Feb 19 '13 at 10:01
  • So how do I fix it? If I put window into the code at the end `})(window);` it doesn't make much of a difference. Am I just better of removing `'use strict';` ?! – Greg Feb 19 '13 at 10:22
  • @SperanskyDanil I don't necessarily *need* it but wanted to know why it wasn't working regardless, learn something new each day and all that! – Greg Feb 19 '13 at 15:20
  • Although that said its for a PhoneGap project so thought it best to make sure things were tight. – Greg Feb 19 '13 at 15:23