日期:2014-05-16  浏览次数:20299 次

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