解开AJAX技术生命中的达芬奇明码
解开AJAX技术生命中的达芬奇明码
几乎每位在开发JavaScript时尝试运用面向对象技术的开发者,或多或少都会问本人一个成绩:“如何调用父类(super class)的方法?”在Ajax技术还没有目前这样炙手可热之前,这种成绩很少出现,由于大少数开发者仅在停止客户端form验证或许简略的DHTML/DOM操作时利用JavaScript。在那些简略的处理计划中,函数式编程(functional programming)是很无心义的,面向对象编程则处在次之重要的地位。如今,Ajax技术发展势头迅猛,开发者已经建设了一个调用大量客户端JavaScript、始终增长的、简单的系统。因此,在JavaScript上尝试OO技术便成为了治理简单性的一种手腕。在此过程中,少数开发者很快便意识到:JavaScript是一种原型化的(prototypical)言语,它短少OO本身带来的多种便利。
OO设计的主旨和关于它的一些话题谈起来很大,但只着眼于Class的定义模式,我以为它是JavaScript开发者尝试处理成绩的首选。因此,你可能在互联网上找到许多不同的成绩处理案例,但在我看过它们后未免有些绝望——这些案例都是在某个场合下实用,而不是放之四海而皆准的通法。而我对这个话题的兴味来自于我的team在开发 ThinWire Ajax Framework 的影响。因为这个框架生成出对客户端代码的须要,才使咱们“被迫”去完成可靠的、支持父类方法调用的OO形式。经过父类调用,你可能进一步依托类的承继特性来外围化通用代码,从而更易于缩小反复代码,去掉客户端代码的坏味道。
下面列举出了一些在我的钻研过程中遇到的处理模式。最终,我没有从中找出一个可能接纳的处理计划,于是我不得不完成一个本人的处理计划,你将在本文的开头局部看到这个计划。
但是父类调用在这里是最重要的OO机制,因此我需求一个相应的工作形式,也正是由于在我的观点中原型化模式是俊俏的,所以我更需求一种愈加人造地利用JavaScript定义类的方法。
More Solutions:
好吧,让咱们进入探讨。正如开发者所觉察的那样,在JS中完成根本的承继是很容易的事,理想上有一些家喻户晓的方法:
俊俏的Solution:
没有停止父类调用的简略承继:
// 提早写好的JavaScript Class定义和承继
// 当然,这种代码很俊俏,分发着代码的坏味道。
function BaseClass() {
//BaseClass constructor code goes here
}
BaseClass.prototype.getName = function() {
return "BaseClass";
}
function SubClass() {
//SubClass constructor code goes here
}
//Inherit the methods of BaseClass
SubClass.prototype = new BaseClass();
//Override the parent's getName method
SubClass.prototype.getName = function() {
return "SubClass";
}
//Alerts "SubClass"
alert(new SubClass().getName());
导致 IE内存泄露 的Solution:
这种完成模式可以导致在IE中的内存走漏,你应该尽量避免:
// 运转时的JavaScript Class 定义和承继
// 看下来很传统,但这些脚本会导致在Internet Explorer中的内存走漏.
function BaseClass() {
this.getName = function() {
return "BaseClass";
};
//BaseClass constructor code goes here
}
function SubClass() {
//在对象实例建设时重载父类的getName方法
this.getName = function() {
return "SubClass";
}
//SubClass constructor code goes here
}
//Inherit the methods of BaseClass
SubClass.prototype = new BaseClass();
//Alerts "SubClass"
alert(new SubClass().getName());
就像我在第一个完成方法中所注释的那样,第一个完成方法有些俊俏,但它相比惹起内存走漏的第二种模式便是首选了。
我把这两种方法放在这里的目标是指出你不应该利用它们。