OO
· 提高复用性,提高可维护性
· 可以使用各种成熟的设计模式
命名空间
·除了避免命名冲突,还有比较重要的就是能使程序员方便的找到他们所需要的类型和类,
在开发中发现很多程序员命名空间的名字起的不知道什么意思,然后某个命名空间下的类
的功能也不知道做什么用的,两种业务相关的类放在一个命名空间下,造成了代码的层次
混乱,不方面以后维护。
注册命名空间 Type.registerNamespace("Namespace");
类
·定义构造函数
类的构造函数为function定义
function myFunction(){}
var myfun = new myFunction();
·定义成员
microsoft ajax library 面向对象类型系统将 get_ 和 set_ 开头的方法认作属性
【code demo】:
MyNamespace.Myclass = function(param1, ...) //定义构造函数
{
this._myProperty = null;
}
//定义属性,方法成员 , 注意各个成员之间需要用逗号隔开,要不会出错
MyNamespace.MyClass.prototype =
{
get_myProperty:function()
{return this._myProperty;},
set_myProperty:function(value)
{this._myProperty=value;},
methodName:function(){}
}
·注册类
【code demo】:
MyNamespace.Myclass = function(param1, ...)
{
//定义构造函数
}
MyNamespace.MyClass.prototype =
{
//定义属性,方法成员
}
MyNamespace.MyClass.registerClass('MyNamespace.MyClass'); //注册类
使用Demo
【code demo】:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<script language="javascript" type="text/javascript">
Type.registerNamespace("dongdeNamespace");
dongdeNamespace.Worker = function(name)
{
this._name = name ? name:"(unknown)";
this._bornyear = 0;
}
dongdeNamespace.Worker.prototype=
{
get_name:function()
{
return this._name;
},
get_bornyear:function()
{
return this._bornyear;
},
set_bornyear:function(value)
{
this._bornyear=value;
},
getAge:function()
{
return 2008-this._bornyear;
},
getWorkerDescript:function()
{
return String.format("{0}年龄:{1},出生于:{2}",this._name,this.getAge(),this.get_bornyear()); //不能去除this
}
}
dongdeNamespace.Worker.registerClass("dongdeNamespace.Worker");
var worker = new dongdeNamespace.Worker("dongde");
worker.set_bornyear(1981); //这里注意为属性赋值的方式
alert( worker.getWorkerDescript() );
</script>
抽象类
·包含抽象方法的类为抽象类
·microsoft ajax library 面向对象类型系统 将包含运行后直接抛出异常的方法的类叫做抽象类,
直接抛出异常的方法叫做抽象方法
·继承,调用父类的构造函数,有父类的类必须调用父类的构造函数(否侧会丢失继承效果)
调用父亲类的构造函数语法 MyNamespace.MyClass.initializeBase(this,[param1,...]);
[param1,...]参数 表示父类的构造函数的参数名,注意是参数名不是参数值
·注册时必须提供父类
MyNamespace.MyClass.registerClass("MyNamespace.MyClass",MyNamespace.parentclass);
·定义同名的方法就可以覆盖父类的抽象方法
·toString方法无法继承,toString方法是javascript系统自带的一个方法,父类和子类作为对象都有toString方法,
但是没有继承
·调用父类的方法 MyNamespace.MyClass.callBaseMethod(this,"MethodName",[param1,...]); //MethodName是父类的方法名
this.MethodName(); //表示调用子类自己的MethodName方法
【code demo】:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<script language="javascript" type="text/javascript">
Type.registerNamespace("dongdeNamespace");
dongdeNamespace.Worker = function(name)
{
this._name = name ? name:"(unknown)";
this._bornyear = 0;
}
dongdeNamespace.Worker.prototype=
{
get_name:function()
{
return this._name;
},
get_bornyear:function()
{
return this._bornyear;
},
set_bornyear:function(value)
{
this._bornyear=value;
},
getAge:function()
{
return 2008-this._bornyear;
},
getWorkerDescript:function()
{
return String.format("{0}年龄:{1},出生于:{2}",this._name,this.getAge(),this.get_bornyear());
},
//抽象方法
getSalary:function()
{
throw Error.notImplemented();
}
}
/
dongdeNamespace.Manager = function(name)
{
dongdeNamespace.Manager.initializeBase(this,[name]);
}
dongdeNamespace.Manager.prototype=
{
getSalary:function()
{
return 10000;
}
}
//
dongdeNamespace.AdvanceManager = function(name)
{
dongdeNamespace.AdvanceManager.initializeBase(this,[name]);
}
dongdeNamespace.AdvanceManager.prototype=
{
getWorkerDescript:function()
{
return dongdeNamespace.AdvanceManager.callBaseMethod(this,"getWorkerDescript")+"我工资高吧";
},
getSalary:function()
{
return 18000;
}
}
dongdeNamespace.Manager.registerClass("dongdeNamespace.Manager",dongdeNamespace.Worker);
var worker = new dongdeNamespace.Manager("dongde");
worker.set_bornyear(1981);
alert( worker.getWorkerDescript() +"工资:"+ worker.getSalary() );
dongdeNamespace.AdvanceManager.registerClass("dongdeNamespace.AdvanceManager",dongdeNamespace.Worker);
var worker2 = new dongdeNamespace.AdvanceManager("dongde2");
worker2.set_bornyear(1961);
alert( worker2.getWorkerDescript() +"工资:"+ worker2.getSalary() );
</script>
----未完,请看续篇http://www.cnblogs.com/Brave-Heart/archive/2008/06/26/1230619.html