由闭包引起的对javascript代码可维护性的思考
在最近的编程实践中由闭包的使用引起了我对javascript代码可维护性的思考。面向对象的其中一个特性封装性通过封装可以降低类与类之间或模块与模块之间耦合性从而使我们的设计更加高内聚低耦合,在大规模的程序开发中这是度量程序可维护性的一个指标,在大量应用了基于javascript的RIA的项目中javascript代码的可维护性也变得越来越值得我们去关注。因为在javascript中没有类的概念,所以我通常会借用闭包来将数据和操作这些数据的方法封装在一起来解决设计中对象的高内聚和对象之间的松耦合的问题,然而当我试图把一个对象的构造函数定在一个闭包中时却对我产生了一些迷惑。
在下面这个演示中两个对象共享被闭包了的变量t,和_this 本意是想用这个变量来模拟在基于类的面向对象语言中的类的私有成员变量,所以当调用a1.test()方法来输出_this.v的值时这里的_this并不我们所期望的a1对象,它在a2对象被改变了,所以此时_this指向的是我们后创建对象a2的引用。
在下面这个演示中两个对象共享被闭包了的变量t,和_this 本意是想用这个变量来模拟在基于类的面向对象语言中的类的私有成员变量,所以当调用a1.test()方法来输出_this.v的值时这里的_this并不我们所期望的a1对象,它在a2对象被改变了,所以此时_this指向的是我们后创建对象a2的引用。
在使用javascript库的同时关注真实实现细节,在代码的调试时能让我们更快的找到问题所在。
(function(){ var t = 0; var _this; function Adder(x){ _this = this; _this.v = x; t = t + (+x); } Adder.prototype.test = function (){ alert(t) }; Adder.prototype.test2 = function (){ alert(_this.v); }; window.Adder = Adder; })(); var a1= new Adder(5); a1.test();//output:5 var a2 = new Adder(1); a2.test();//output:6 a1.test2();//output:1