对于jsOO方法和属性的写法
其实OO中方法和属性重要的就在于封装,隐藏信息,实践中我尝试了下面有三种写法,用来封装js库。但js对象本身是随时都可以改变的,因此不是真OO。
最让搞java出身的我郁闷的是类的静态方法属性实例竟然木有,要通过constructor来访问!
var MyClass = function()
{
//闭包私有变量,跟java里的私有变量一样,
//外部只能用getter setter来修改变量 _nane
var _name = 'MyClass';
this.setName = function(name){
_name = name;
};
this.getName = function(){
return _name;
}
};
var myclass = new MyClass();
alert(myclass.getName());
myclass.setName(123);
alert(myclass.getName());
//上面的写法中 如果用户写成了如下写法:
alert(myclass.getName);
alert(myclass.setName);
//可以打印出方法是怎么实现的具体细节,
//2.隐藏内部方法细节:这种方法一般用于隐藏用纯js封装的安全性方法,牺牲了性能,当然这段js要直接eval,不能被F12出来。
(function(){
var MyClass = function()
{
//闭包私有变量,跟java里的私有变量一样,
//外部只能用getter setter来修改变量 _nane
var _name = 'MyClass';
function _setName(name){
_name = name;
}
this.setName = function(name){
_setName(name)
};
function _getName(){
return _name;
}
this.getName = function(){
return _getName();
}
};
window.MyClass =function(){
MyClass.apply(this);
};
})();
var myclass = new MyClass();
var myclass = new MyClass();
alert(myclass.getName());
myclass.setName(123);
alert(myclass.getName());
//这回看不到_name了,方法的细节被闭包了,但明显有一倍的对象开销
alert(myclass.getName);
alert(myclass.setName);
//3.全裸露属性
var MyClass = function()
{
//这是私有变量不需要被直接修改,但外部可以直接访问和修改,但这样导致的结果不可预测
this._innerName = 'innerName'+'__MyClass';
//提供这个方法以保证可用的
this.setInnerName = function(innerName){
//innerName的一些特殊处理逻辑,比如有特殊后缀
this._innerName = innerName+'__MyClass'
};
this.outerName = 'outName';
};
var myClass = new MyClass();
myClass.setInnerName('newInnerName');//
myClass._innerName ='newInnerName';//缺少后缀了,导致的依赖于此的逻辑出错。
myClass.outerName = 'newOutName';//能直接访问干嘛要getter setter。
//Ext是js的OOP做得最好的了,但也有点笨重,有空研究了再补充
对于继承
http://www.w3school.com.cn/js/pro_js_inheritance_implementing.asp
function extend(self,sup,override){
for(var o in sup){
if(self.hasOwnProperty(o) && !override){
continue;
}
self[o] = sup[o];
}
}
命名空间和包
javascript中没有真正的包,有命名空间和包都有避免重名的作用,对js文件的管理使用文件目录的,完全可以用文件目录和命名空间共同来实现java中包的功能,这里需要用到动态加载机制,当然良好的抽象和设计是基础。
Ext是js的OOP做得最好的了,但也有点笨重,有空研究了再补充