zengdj

点滴经验,源自实践

博客园 首页 新随笔 联系 订阅 管理
方法3是方法2的小小改进,对子类的定义方式有所改进,更像是C#中类的定义方式,也是Yahoo Library中使用的方法:

// namespace 
JsDev = {};

JsDev.extend = function(subClass, baseClass, overrides) {
   if( ! subClass|| ! baseClass)
   {
         throw new Error("inheritance error");
   }
   function inheritance() {}
   inheritance.prototype = baseClass.prototype;

   subClass.prototype = new inheritance();          // 改变子类的原型,使其原型与父类原型串连起来
   subClass.prototype.constructor = subClass;       // 改变子类的构造函数   与方法2的区别:去掉对基类构造函数的引用
   /*subClass.baseConstructor = baseClass;*/            // 保存对基类构造函数的引用,以便在子类中调用
   subClass.superClass = baseClass.prototype;       // 保存对父原型的引用
   if(overrides)
   {
       for(var i in overrides)
       {
          subc.prototype[i] = overrides[i];
       }
   }
}

//Person class
function Person(first, last) {
    this.first = first;
    this.last = last;
}

Person.prototype.toString = function() {
    return this.first + " " + this.last;
};


//Employee class
function Employee(first, last, id) {    
    //与方法2的区别    
    if(first)      
       Employee.superClass.constructor.call(this, first, last); // 调用父类中的构造函数     
    Employee.baseConstructor.call(this, first, last);  // 调用父类中的构造函数
    this.id = id;
}
// subclass 
JsDev.extend(Employee, Person);
Employee.prototype.toString = function() {
    return Employee.superClass.toString.call(this) + ": " + this.id;  // 调用父类中被覆盖的同名方法
};

//Managerfunction 
Manager(first, last, id, department) {
    //与方法2的区别
    if(first)
       Manager.superClass.constructor.call(this, first, last, id); // 调用父类中的构造函数
    Manager.baseConstructor.call(this, first, last, id);
    this.department = department;
}

// subclass Employee
JsDev.extend(Manager, Employee);
Manager.prototype.toString = function() {
    return Manager.superClass.toString.call(this) + ": " + this.department;
};
子类还可以这样定义:
//Employee class
function Employee(first, last, id) {    
    if(first)      
       Employee.superClass.constructor.call(this, first, last); // 调用父类中的构造函数     
    this.id = id;
}
// subclass 
PersonJsDev.extend(Employee, Person,
    {
        toString : function() 
        {
            return Employee.superClass.toString.call(this) + ": " + this.id;  // 调用父类中被覆盖的同名方法
         },
        anotherMethod: function() 
{
} } )


posted on 2007-09-14 06:17  DingJun  阅读(1093)  评论(0编辑  收藏  举报