日期:2014-05-16 浏览次数:20299 次
面向对象编程思想在提出之后,很快就流行起来了,它将开发人员从冗长,繁复,难以调试的过程式程序中解放了出来,过程式语 言如 C ,代码的形式往往如此:
Component comp; init_component(& comp, props);
?
而面向对象的语言如 Java ,则会是这种形式:
?
Component comp; comp.init(props);
?
可以看出,方法是对象的方法,对象是方法的对象,这样的代码形式更接近人的思维方式,因此 OO 大行其道也并非侥幸。
???????? JavaScript 本身是基于对象 的,而并非基于类。但是, JavaScript 的函数式语言的特性使得它本身是可编程 的,它可以变成你想要的任何形式。我们在这一章详细讨论如何使用 JavaScript 进行 OO 风格的代码开发。
JavaScript 中的继承可以通过原型链来实现,调用对象上的一个方法,由于方法在 JavaScript 对象中是对另一个函数对象的引用,因此解释器会在对象中查找该属性,如果没有找到,则在其内部对象 prototype 对象上搜索,由于 prototype 对象与对象本身的结构是一样的,因此这个过程会一直回溯到发现该属性,则调用该属性,否则,报告一个错误。关于原型继承,我们不妨看一个小例 子:
?
?
function Base(){
this .baseFunc = function (){
print ( "base behavior" );
}
}
function Middle(){
this .middleFunc = function (){
print ( "middle behavior" );
}
}
Middle. prototype = new Base();
function Final(){
this .finalFunc = function (){
print ( "final behavior" );
}
}
Final. prototype = new Middle();
function test(){
var obj = new Final();
obj.baseFunc();
obj.middleFunc();
obj.finalFunc();
}
?
? |
图 原型链的示意图
?
在 function test 中,我们 new 了一个 Final 对象,然后依次调用 obj.baseFunc ,由于 obj 对象上并无此方法,则按照上边提到的规则,进行回溯,在其原型链上搜索,由于 Final 的原型链上包含 Middle ,而 Middle 上又包含 Base ,因此会执行这个方法,这样就实现了类的继承。
?
?
但是这