日期:2014-05-16  浏览次数:20451 次

js 继承实现

看过很多的js继承实现,发现这段代码的继承实现是比较好的一种,好像跟extjs的继承机制非常相似,

/**

 * 扩展函数

 * @param target 扩展对象

 * @param params 扩展参数

 */

function extend(target, params) {

       if (!target) {

              target = {};

       }

       for (var prop in params) {

              target[prop] = params[prop];

       }    

       return target;

}
?
/**

 * 继承函数

 * @param SuperClass 父类

 * @param overrides 重写方法

 */

function extendClass(SuperClass, overrides) {

       var SubClass = function() {

                // 自动调用构造函数

              this.initialize.apply(this, arguments);

       };

      

       SubClass.prototype = new SuperClass();

      

       extend(SubClass.prototype, overrides);

      

       SubClass.superclass = SuperClass;

      

       return SubClass;

}

?使用方法

var Animal = extendClass(Object, {

       initialize: function(name){

              this.name = name;

       },

   

    showName: function(){ 

        alert(this.name); 

    }

});

 

var Cat = extendClass(Animal, {

       initialize: function(name) {

                // 调用父类构造函数

              Cat.superclass.prototype.initialize.call(this, name);

       }

});

 

var BlackCat = extendClass(Cat, {

       initialize: function(name, type) {

                // 调用父类构造函数

              BlackCat.superclass.prototype.initialize.call(this, name);

              this.type = type;

       },

       showType: function() {

              alert(this.type);

       },

       showName: function() {

              alert(this.name + ":" + this.type);

       }

});

 

 

var cat = new Cat("cat name");

// 继承方法

cat.showName();

 

// true

alert(cat instanceof Animal);

 

// true

alert(cat instanceof Cat);

 

// false

alert(cat instanceof BlackCat);

 

var blackCat = new BlackCat("123", "black");

 

// 方法重写

blackCat.showName();

 

// 自有方法

blackCat.showType();

 

// true

alert(blackCat instanceof Animal);

 

// true

alert(blackCat instanceof Cat);

 

// true

alert(blackCat instanceof BlackCat);
?