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函数。
(待续...)
整的面向对象实现(没有类,继承等概念),但凭借其灵活的语法,仍
然可以在一定程度上实现 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函数。
(待续...)