日期:2014-05-16  浏览次数:20299 次

JavaScript内核系列 第8章 面向对象的JavaScript(上)

第八章 面向对象的 Javascript

面向对象编程思想在提出之后,很快就流行起来了,它将开发人员从冗长,繁复,难以调试的过程式程序中解放了出来,过程式语 言如 C ,代码的形式往往如此:


Component comp;
init_component(& comp, props);

?

而面向对象的语言如 Java ,则会是这种形式:

?

Component comp;
comp.init(props);

?

可以看出,方法是对象的方法,对象是方法的对象,这样的代码形式更接近人的思维方式,因此 OO 大行其道也并非侥幸。

???????? JavaScript 本身是基于对象 的,而并非基于类。但是, JavaScript 的函数式语言的特性使得它本身是可编程 的,它可以变成你想要的任何形式。我们在这一章详细讨论如何使用 JavaScript 进行 OO 风格的代码开发。

8.1 原型继承

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 ,因此会执行这个方法,这样就实现了类的继承。


?

base behavior
middle behavior
final behavior

?

但是这