函数构造法不同类方法相同出现的问题:在做链表的时候发现了一个很有意思的问题。先为大家介绍一下背景——我分别写了三个js文件,分别定义普通链表、双向链表和循环链表的类及相关方法。三个文件中均采用了函数构造法定义类,代码如下
1.普通链表
2.双向链表
3.循环链表
为了方便检验,我还写了一个html文件以data.html及一个调用三种链表类的js文件data.js
结果发现在没有写循环链表之前,普通链表与双向链表都实现了添加元素到指定位置、查看链表所有元素、查看某指定元素的上一元素以及删除元素的功能,但在加上循环链表之后就出现错误了——普通链表和双向链表除了添加和删除之外,其他功能都出现了异常
控制台抛出了一个位置在循环列表中的错误,一开始我都懵逼了,感觉写的确实没有错啊,后面突然想到一个细思极恐的细节,我三种链表的节点类都命名为Node、三种不同链表的链表类都有相同的方法,于是就可以解释为什么前两种链表出现问题,抛出的错误却在循环链表的实现js文件中。
具体原因是js文件只要被引用到相同html文件中,就可以相互访问其中的函数,而Node.js、doubleNode.js与circleNode.js均存在名称一样的函数,所以会后引用到html中的覆盖先引用的,也就是说在控制台中没抛出错误之前其实就已经出问题了,因为Node.js中的方法全部被doubleNode.js中的同名方法覆盖了,由于普通链表和双向链表区别就在于能否访问某个节点的上一个节点,因此各种方法到具体实现基本相同,问题没有显现出来。而循环链表由于尾节点的下一个节点不是null而是首节点,所以很多方法的实现上回有差别,于是问题才在控制台中暴露出来,而如何解决这种问题也很简单,改变方法名即可,比如
此时输出的就是”classA”,如果playa()与playb()的名称相同的话,就会输出”classB”。
整个问题的出现的原因其实很简单,但还是需要我们注意。