OOP with JavaScript(一) OOP的基本语法

javascript是一门太过灵活的函数语言,其语言机制本身并没有提供完
整的面向对象实现(没有类,继承等概念),但凭借其灵活的语法,仍
然可以在一定程度上实现 OOP

比如类的概念,可以通过以下语法来实现类TestA:
TestA = function(nValue) {
    this.m_nValue = nValue;
    this.funcA = function() {
        alert("funcA:" + this.m_nValue);
    }
}

TestA类的使用方法如下:
a = new TestA(100);
a.funcA();

在函数语言的基础上,实现OOP的继承需要一些特殊的语法,
《Professional.JavaScript.For.Web.Developers》一书中,
列举了多种继承的实现语法,网上最常用的是这种:
TestB = function() {
    this.funcB = function() {
        alert("funcB");
    }
}

TestB.prototype = new TestA(100);

但是这样的语法对于带参数的类构造不太适用,我喜欢用下面这种
TestB = function(nValue) {
    this.superContructor = TestA;
    this.superContructor(nValue);
   
    this.funcB = function() {
        alert("funcB");
    }
}

继承实现了,那函数重载怎么做呢,很简单
TestB = function(nValue) {
    this.superContructor = TestA;
    this.superContructor(nValue);
   
    this.funcB = function() {
        alert("funcB");
    }

    /*    重载父类的funcA函数    */
    this.funcA = function() {
        alert("funcA overrided by TestB:" + this.m_nValue);
    }
}

如果重载了funcA,但是还需要调用父类的函数(类似C++中的显示调用CTestA::funcA()),
可以用以下方法:
TestB = function(nValue) {
    this.superContructor = TestA;
    this.superContructor(nValue);
   
    this.funcB = function() {
        alert("funcB");
    }

    /*    重载父类的funcA函数,同时在子类的实现中再调用父类的原实现函数    */
    this.super_funcA = this.funcA;
    this.funcA = function() {
        if ((this.m_nValue % 2) == 0)  {
            alert("funcA overrided by TestB:" + this.m_nValue);
        }
        else {
            this.super_funcA();
        }
    }
}

除了这些基本的OOP功能之外,javascript作为一门动态语言,还支持动态构造一个类或者函数:
for (var i = 0; i<10; i++) {
    eval("function test_func" + i + "() { alert (" + i + "); }");
}

上面的代码动态构造了10个函数,分别名为test_func0到test_func9,其功能是分别显示0到9的数字。
这样的语法和C/C++的宏或者模板相比,灵活度提高了非常多。

这个功能在dhtml中特别有用,对于动态生成的dhtml对象,可以动态创建其对应的event函数。

(待续...)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值