zoukankan      html  css  js  c++  java
  • JavaScript继承(转载)

    代码

    var initializing = false;

    function jClass(baseClass, prop) { 

       
    //只接受一个参数的情况- jClass(prop)

        
    if (typeof (baseClass) === "object") {

            prop 
    = baseClass;

            baseClass 
    = null;
        }

     
    //本次调用所创建的类(构造函数)
        function F() {

    //如果当前处于实例化类的阶段,则调用init原型函数
            if (!initializing) {

                
    //如果父类存在,则实例对象的baseprototype指向父类的原型
                //这就提供了在实例对象中调用父类方法的途径
                if (baseClass) {

                    
    this.baseprototype = baseClass.prototype;
                }

                
    this.init.apply(this, arguments);
            }
        }

       
    //如果此类需要从其他类扩展
        if (baseClass) {

            initializing 
    = true;

            F.prototype 
    = new baseClass();

            F.prototype.constructor 
    = F;

            initializing 
    = false;
        }
        
    //覆盖父类的同名函数
        for (var name in prop) {

    //如果此类继承自父类baseClass并且父类原型中存在同名函数name
            if (prop.hasOwnProperty(name)) {


                
    if (baseClass && typeof (prop[name]) === "function" && typeof (F.prototype[name]) === "function") {

                    
    //重定义函数name
                    //首先在函数上下文设置this.base 指向父类原型中的同名函数
                    //然后调用函数prop[name],返回函数结果

                    
    //注意:这里的自执行函数创建了一个上下文,这个上下文返回另一个函数,
                    //此函数中可以应用此上下文中的变量,这就是闭包(Closure)
                //这是Javascript框架开发中的常用技巧
                   
                    F.prototype[name] 
    = (function(name, fn) { return function() { this.base = baseClass.prototype[name]; return fn.apply(this, arguments); } })(name, prop[name]);

                }
                
    else {

                    F.prototype[name] 
    = prop[name];
                
                }
            
            }
        }

        
    return F;
    }

    var Person = jClass({

        init: 
    function(name) {
            
    this.name = name;
        },
        getName: 
    function() {
            
    return this.name;
        }
    });

    var Employee = jClass(Person, {

        init: 
    function(name, employeeID) {
            
    this.base(name);

            
    this.employeeID = employeeID;
        },

        getEmployeeID: 
    function() {
            
    return this.employeeID;
        },

        getName: 
    function() {
            
    return "Employee name:" + this.base();
        }

    });

    var zhang = new Employee("ZhangSan""1234"); //调用原型的init函数,再调用覆盖的init函数,再执行this.base函数再执行基类的init函数

    alert(zhang.getName());
    //调用原型的getName()函数,再调用覆盖的getName函数,再调用base()函数,再执行基类的getName函数

    转自:http://www.cnblogs.com/sanshi/archive/2009/07/13/1522647.html

  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/johnwonder/p/1689594.html
Copyright © 2011-2022 走看看