首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

诡谲的javascript面向对象

2012-08-28 
诡异的javascript面向对象??????? javascript是函数式语言,但稍加改装可以以面向对象的方式使用。最近开发

诡异的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对象

热点排行