2013-02-19 68 views
0

我閱讀John Resig的博客文章,介紹了他基於base2和原型編寫的簡單JavaScript繼承插件。簡單的JavaScript繼承插件錯誤

示例代碼是在這裏: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; 
    }; 
})(); 

這工作。但是,如果我在頂部取消註釋'use strict';,則會引發異常,但無法找出解決方案。有任何想法嗎?

+0

的文章[這裏](http://ejohn.org/blog/simple-javascript-inheritance/)對於那些有興趣 – Doug 2013-02-19 09:46:06

回答

0

在這種情況下,當您調用匿名函數thisundefined您不要調用函數作爲對象的方法。在不嚴格模式下this將爲window對象。

參見:Why is "this" in an anonymous function undefined when using strict?

+0

這有什麼做用匿名或不是,它是這是一個範圍問題。 – Christoph 2013-02-19 09:27:30

+0

您可以撥打匿名函數沒有'this'被未定義... – Christoph 2013-02-19 09:32:39

+0

http://jsfiddle.net/2xLTH/ – Christoph 2013-02-19 09:41:35