(function(){ var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; // The base Class implementation (does nothing) this.TestExend = function(){}; var self = this; // Create a new Class that inherits from this class this.TestExend.extend = function(prop) { var _super = this.prototype; console.log("Test : " + self == this); // Instantiate a base class (but only create the instance, // don't run the init constructor) initializing = true; var prototype = new this();(this指向的是TestExend本身) 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 DummyTest() { // All construction is actually done in the init method if ( !initializing && this.init ) this.init.apply(this, arguments); } // Populate our constructed prototype object DummyTest.prototype = prototype; // Enforce the constructor to be what we expect DummyTest.prototype.constructor = DummyTest; // And make this class extendable DummyTest.extend = arguments.callee; return DummyTest; }; })();
var Animal= TestExend.extend({ init: function(isAnimal){ this.testPerson= isAnimal ; } }); var Person = Animal.extend({ init: function(){ this._super( false ); } });
var tmpAnimal = new Animal(true);
var tmpPerson = new Person();
实现提示:
当一个函数作为一个对象的方法去调用,this指向的是对象本身. 下面的例子中,当 o.f()被调用,函数里面的this指向的是 o对象. var o = { prop: 37, f: function() { return this.prop; } }; console.log(o.f()); // logs 37 假如 o 对象只申明了一个属性,其f方法在开始声明时还没有被定义, 然后通过o.f直接被赋值为其他方法,其最后的效果也是一样的, var o = {prop: 37}; function independent() { return this.prop; } o.f = independent; console.log(o.f()); // logs 37