Using zInherit Library to build class inheritance in three levels : zInherit « Object Oriented « JavaScript Tutorial

Home
JavaScript Tutorial
1.Language Basics
2.Operators
3.Statement
4.Development
5.Number Data Type
6.String
7.Function
8.Global
9.Math
10.Form
11.Array
12.Date
13.Dialogs
14.Document
15.Event
16.Location
17.Navigator
18.Screen
19.Window
20.History
21.HTML Tags
22.Style
23.DOM Node
24.Drag Drop
25.Object Oriented
26.Regular Expressions
27.XML
28.GUI Components
29.Dojo toolkit
30.jQuery
31.Animation
32.MS JScript
JavaScript Tutorial » Object Oriented » zInherit 
25.11.2.Using zInherit Library to build class inheritance in three levels
<html>
<head>
<title>Example</title>
<script type="text/javascript">
/*------------------------------------------------------------------------------
 * JavaScript zInherit Library
 * Version 1.0
 * by Nicholas C. Zakas, http://www.nczonline.net/
 * Copyright (c) 2004-2005 Nicholas C. Zakas. All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *------------------------------------------------------------------------------
 */
 
/**
 * Inherits properties and methods from the given class.
 * @scope public
 @param fnClass The constructor function to inherit from.
 */
Object.prototype.inheritFrom = function (fnClass /*: Function *//*:void*/ {

    /**
     * Inherits all classes going up the inheritance chain recursively.
     @param fnClass The class to inherit from.
     @param arrClasses The array of classes to build up.
     * @scope private
     */
    function inheritClasses(fnClass /*:Function*/
                            arrClasses /*:Array*//*:void*/ {
        
        arrClasses.push(fnClass);

        if (typeof fnClass.__superclasses__ == "object") {
            for (var i=0; i < fnClass.__superclasses__.length; i++){
                inheritClasses(fnClass.__superclasses__[i], arrClasses);
            }
        }
    }
    
    if (typeof this.constructor.__superclasses__ == "undefined") {
        this.constructor.__superclasses__ = new Array();
    }
    
    inheritClasses(fnClass, this.constructor.__superclasses__);
    
    for (prop in fnClass.prototype) {
        if (typeof fnClass.prototype[prop== "function") {
            this[prop= fnClass.prototype[prop];
        }
    }
};

/**
 * Determines if the given object is an instance of a given class.
 * This method is necessary because using {@link #inheritFrom} renders
 * the JavaScript <code>instanceof</code> operator useless.
 @param fnClass The constructor function to test.
 @return True if the object is an instance of the class, false if not.
 * @scope public
 */
Object.prototype.instanceOf = function (fnClass /*:Function*//*: boolean */ {

    if (this.constructor == fnClass) {
        return true;
    else if (typeof this.constructor.__superclasses__ == "object") {
        for (var i=0; i < this.constructor.__superclasses__.length; i++) {
            if (this.constructor.__superclasses__[i== fnClass) {
                return true;
            }
        }
        return false;
    else {
        return false;
    }
};

</script>
</head>
<body>
<script type="text/javascript">


function Shape(iSides) {
    this.sides  = iSides;
}

Shape.prototype.getArea = function () {
    return 0;
};    

function Triangle(iBase, iHeight) {
    Shape.call(this, 3);
    this.base = iBase;
    this.height = iHeight;
}

Triangle.prototype.inheritFrom(Shape);
Triangle.prototype.getArea = function () {
    return 0.5 this.base * this.height;
};    

function Rectangle(iLength, iWidth) {
    Shape.call(this, 4);
    this.length = iLength;
    this.width = iWidth;
}

Rectangle.prototype.inheritFrom(Shape);

Rectangle.prototype.getArea = function () {
    return this.length * this.width;
};    

var triangle = new Triangle(124);
var rectangle = new Rectangle(2210);

alert(triangle.sides);
alert(triangle.getArea());

alert(rectangle.sides);
alert(rectangle.getArea());

alert(triangle.instanceOf(Triangle));
alert(triangle.instanceOf(Shape));
alert(rectangle.instanceOf(Rectangle));
alert(rectangle.instanceOf(Shape));

</script>
 
</body>
</html>
25.11.zInherit
25.11.1.Using zInherit Library to build class inheritance
25.11.2.Using zInherit Library to build class inheritance in three levels
25.11.3.Using instanceOf method from zInherit Library
25.11.4.Using inheritFrom method from zInherit Library
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.