Javascript模拟类的继承

虽然在Javascript中大量地使用了对象,但是它并没有正式类的概念,而是使用特有的原型对象为基础的继承机制模拟了经典的面向对象程序设计语言中的以类为基础的继承机制,并且做为非常出色。这种以原型对象为基础的继承机制直观的表示为:超类(Object) → 原型对象 → 子类(内部类和自定义类) → 类的实例(对象),这看起来有些奇怪,但你必须接受这种继承机制。

Javascript中并没有明确提出一个类如何从另一个类中继承其属性和方法,但我们还是有办法模拟的:

//在超类Object中定义继承的方法
//子类都将使用extends来说明它继承了谁
Object.prototype.extends = function(from_obj,to_obj){
    var temp;
    for(temp in from_obj){
        to_obj[temp] = from_obj[temp];
    }
}

//为Class类定义一个构造函数的方法
//这个构造函数也定义了类自身,同时还定义了一个空的原型对象
function Class(){
    this.x;//创建属性x但初始化,值为undefined
    this.y = "yy";//创建属性y并初始化
    this.add = function(){ return this.x + this.y;};//创建add方法
}

//为Class1类定义一个构造函数的方法
function Class1(){
    this.extends(new Class(),this);//继承Calss
    this.add = function(){ return this.x + this.z;};//覆盖了Class中的add方法
    this.z = "zz";//创建属性z并初始化
    this.minus = function(m,n){return m-n;};//创建minus方法
}

//为Class2类定义一个构造函数的方法
function Class2(a){
    this.extends(new Class1(),this);//继承Calss1
    //模拟Java一个类多个构造函数。如Array()、Array(3)、Array("aa","bb","cc")都可创建数组
    if(a==undefined){
        this.a = "aa";//创建属性z赋于默认值
    }else{
        this.a = a;//创建属性z并赋值
    }
}

下边使用构造函数创建上边类的实例:

//使用构造函数创建Class类实例one
var one = new Class();
document.write(one.x + "<br/>" + one.y + "<br/>" + one.add() + "<br/><br/>");

//使用构造函数创建Class1类实例two
var two = new Class1();
two.x = "xx";
document.write(two.x + "<br/>" + two.y + "<br/>" + two.z + "<br/>" + two.add() + "<br/>" + two.minus(5,3) + "<br/><br/>");

//使用构造函数创建Class2类实例three
var three = new Class2();
three.x = "xx";
document.write(three.x + "<br/>" + three.y + "<br/>" + three.z + "<br/>" + three.a + "<br/>" + three.add() + "<br/>" + three.minus(5,3) + "<br/><br/>");

//使用构造函数创建Class2类实例four
var four = new Class2("mzwu");
four.x = "xx";
document.write(four.x + "<br/>" + four.y + "<br/>" + four.z + "<br/>" + four.a + "<br/>" + four.add() + "<br/>" + four.minus(5,3) + "<br/><br/>");

"构造函数定义了类自身,同时还定义了一个空的原型对象",你可以运行下边的代码证明:

Class2.prototype.constructor == Class2;//结果为true
var names = "";
for(var name in Class2.prototype) names += name;//结果只有extends


上一篇: 【下载】网页设计相关软件
下一篇: 面向对象的Jscript
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
最新日志:
评论: 0 | 引用: 0 | 查看次数: 4262
发表评论
登录后再发表评论!