当前位置: 代码迷 >> 综合 >> John Resig 继承
  详细解决方案

John Resig 继承

热度:30   发布时间:2023-12-06 23:28:11.0

最近我们课程到了面向对象这一章节,为了让大家更好的理解面向对象,我顺手翻译了几篇牛人的文章:

var Person = Class.extend({init: function(isDancing){this.dancing = isDancing;},dance: function(){return this.dancing;} });var Ninja = Person.extend({init: function(){this._super( false );},dance: function(){// Call the inherited version of dance()return this._super();},swingSword: function(){return true;} });var p = new Person(true); p.dance(); // => truevar n = new Ninja(); n.dance(); // => false n.swingSword(); // => true// Should all be true p instanceof Person && p instanceof Class && n instanceof Ninja && n instanceof Person && n instanceof Class 

我认为上面的这种API设计是比较nice的,它达到了几个目的:一、所有的类继承自一个祖先Class二、子类可以覆盖掉父类上的方法,当然了,可以通过super方法来调用父为的同名方法

下面是我的实现:

/* 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 classClass.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 prototypefor (var name in prop) {// Check if we're overwriting an existing functionprototype[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-classthis._super = _super[name];// The method only need to be bound temporarily, so we// remove it when we're done executingvar ret = fn.apply(this, arguments); this._super = tmp;return ret;};})(name, prop[name]) :prop[name];}// The dummy class constructorfunction Class() {// All construction is actually done in the init methodif ( !initializing && this.init )this.init.apply(this, arguments);}// Populate our constructed prototype objectClass.prototype = prototype;// Enforce the constructor to be what we expectClass.prototype.constructor = Class;// And make this class extendableClass.extend = arguments.callee;return Class;}; })();


作者:郑伟的菜园子
链接:https://www.jianshu.com/p/343e3334bf11