代码改变世界

一个JavaScript上的OOP编程技巧:继承

2010-05-20 05:32  Nana's Lich  阅读(1975)  评论(5编辑  收藏  举报

其实这一次要说的东西是在很久以前就发现了的,在我知道博客园这个平台以前也在一个现在已经废弃了的blog上发了出来,但是来了博客园以后很长时间内我都苦于不知道怎么样写文章来讲解比较好……

今天正好睡不着,就索性地来次随性地发挥吧,反正每次都很正经地去说一件事情也是很累的……

 

在探索我马上要介绍的这种技巧之前,我也见过一些文章介绍如何在JavaScript中实现类的继承。但是,我总是觉得这些文章中好像是欠缺了点什么,带着这种缺憾的感觉我就开始了并不算太认真的JavaScript——老实说,我更希望大家能用“ECMAScript”来称呼它——探索旅程。

后来,我发现了一个技巧——其实这个技巧很早以前就被道大师开发出来,并且已经被用在了一些成熟的框架中了,但在我发现它的时候还很难找到文章去介绍它,大部分介绍JavaScript中的继承的文章都是用那种又难看又buggy的方法……

 

 

好吧,也许你已经不耐烦了:随性也用不着说这么多废话吧?

其实那些让我有缺憾感的地方,其中之一就是instanceof运算符的结果。

 

举个例子说,如果我们有这样的一个构造器:

function A(){
}

那么当我们进行这样的测试的时候:

new A() instanceof A

我们得到的结果会是true。

 

但是,如果我们编写一个构造器B,用以前的文章所讲解的这样那样的方法来继承自A,那么进行下面这样的测试得到的结果通常会是false:

new B() instanceof A

不过幸运的是,如果你看的是最近一年以内的文章,多半会介绍这样的一种方法:

function A(){
}
function B(){
}
B.prototype = new A;
B.prototype.constructor = B;

经过这样的处理再进行new B instanceof A的测试,得到的结果就应该是true了。

 

可能你会问了:“哎!?那A的函数体里面要是有对对象的初始化操作呢?B的实例不就没有这些初始化了吗?”

嘿嘿嘿,其实只要再这样改一下就可以了:

function B(){
 A.apply(this, arguments);
}

怎么样?今天你new B了吗?

 

不过,到现在为止,new A和new B还是有一些缺憾,你能猜出来这次我说的缺憾是在哪吗?