诡异的javascript面向对象
javascript是函数式语言,但稍加改装可以以面向对象的方式使用。
最近开发前台应用,都是使用同事开发的js ui控件,看得头大,函数式与面向对象式混杂在一起,凌乱之极,逻辑语义不完整,甚至矛盾,总之可读性非常之差。也许js火候不够,看不懂人家的代码吧。下面是一些我觉得应该遵循的规则,以下会持续更新,每天写一点,写的不好的je的童靴们请指教。
一、javascript的类
例子1、
function square(){ var w=0; this.area=function(){ return w*w; }; this.setW=function(w1){ w=w1; } this.getW=function(){ return w; } } var s=new square(); s.setW(5); alert(s.area());
熟悉吧,跟java中的有点类似啦。
以上代码中,w是个私有变量,在外部不能对w进行操作,比如这样调用h.w=23;
以上的area函数是直接在定义类时定义的,再看看例子2
例子2、
function square(){ var w=0; this.setW=function(w1){ w=w1; } this.getW=function(){ return w; } } square.prototype.area=function(){return this.getW()*this.getW();}; var s=new square(); s.setW(5); alert(s.area());
方式2与方式1不同之处在于把area函数移动至外部再定义 ,且其实现中不是直接 return w*w,因为w是私有变量,外部是不可见的,所以用this.getW来替代。
例子3、
function square(){ this.w=10; this.area=function(){ return w*w; // return this.w*this.w; }; } var s=new square(); alert(s.area());
执行上面的例子时是运行不了的,正确的做法是 return this.w*this.w; 即用this来修饰w. 在成员函数中调用其他成员函数或成员变量,必须要用this修饰,否则是调用的是作用域内的变量或函数,而不是调用类成员变量或函数,这点切记。
例子4、
function square(){ this.w=3; function wShow(){ return w; } this.showWShow=function (){ return wShow(); } } var s=new square(); alert(s.showWShow());
执行以上代码将会出错提示 'w is not define'
以上内部函数试图访问外部函数的w成员,但是造成的效果确是访问作用域内名为w的变量,但无论是全局作用域还是square的作用域,都没有名为w的变量,故提示出错。这点告诉我们,用this修饰的变量跟不用this修饰的变量是完全不同的两个概念,用this修饰的变量只属于类本身,不能被内部非成员函数访问。
wShow可以看成是square的内部类,但却无法访问square的成员w,这点跟java中差别很大
总结1:在函数定义中,只有有this修饰的成员才能算是类成员,且该类成员是公有成员;类是没有私有成员的,但在函数
中用可以把用var来修饰的变量看成是类的私有成员(但实际上不是的,至少类的私有变量,这点跟java有很大不同)。另外上面讨论的是用function来定义的类,其他情况不适用。如字面常量类实例
var square={'width':'20','area':function(){return width*width}}
此种方式定义的是对象实例,而不是类了,注意区分(请看第二部分,待写)。
二、javascripte对象