JAVASCRIPT面向对象的设计.
面向对象编程里最基本的单元,就是类;而像JAVASCRIPT这样一种脚本语言,我们又怎么让她支持,面向对像编程呢?
在GOOGLE上随便找一个关于JAVASCRIPT面向对像的主题,多达亿万;在众多的解决方案中,都会提到"prototype",
的确,要想使JAVASCRIPT支持面向对象,"prototype"功不可磨.在网上找到的许多优秀方案中,大多比较复杂,对于初学者的确有点难度,这里我提供了一个最轻量级的方案.
1,JAVASCRIPT面向对象要解决的几个问题
1.1 构造器,以及构造器参数问题,
1.2 类的属性问题,
1.3 类的方法问题,
1.4 类的事件问题,
1.5 类的继随问题,
1.6 类的命名空间问题,
1.7 类的统一注册问题,
1.8 类的统一实例问题,
从下面的c#类开始解决问题.
namespace PriceReader (命名空间)
{
/// <summary>
/// Summary description for Class1.
/// </summary>
public class Class1:Class2 //继承
{
public Class1()
{
//构造问题.
}
public void test() //方法 公共,私有,等等不同类型的方法.
{
}
}
}
以上面的C#的类,JAVASCRIPT怎么实现呢?
1,解决命名空间
在javascript里,所有的对象都是Object 的一个实例,我们可以用Object 对角来解决命名问题。
var regNamespace = Function.prototype.registerNamespace = function (namespaces)
{
var root = window;
var nsParts = namespaces.split('.');
for(var i=0;i<nsParts.length;i++)
{
var curPart = nsParts[i];
if(!root[curPart])
{
root[curPart] = new Object();
}
root = root[curPart];
}
}
上面的代码,利用object来产生命名空间,
用法
regNamespace("RSUN.Sys.UI");
2,解决继承,以及INTERFACE,ABSTRACT,等等类型的类.
Function.className = "-";
Function.classType = "class";
Function.baseClass = null;
Function.prototype.RegClass = function(className,baseClass)
{
this.className = className.trim();
if(baseClass)
{
this.baseClass = baseClass;
this.prototype = new baseClass;
}
}
Function.prototype.RegAbstractClass = function(className,baseClass)
{
this.RegClass(className,baseClass);
Function.classType = "abclass";
}
Function.prototype.RegInterface = function(interfaces)
{
this.RegClass(interfaces);
Function.classType = "interface";
}
上面的代码,我们解决了继承,以及不同类型的class的注册,在这里可以将interface看成是一种特殊的class.
在GOOGLE上随便找一个关于JAVASCRIPT面向对像的主题,多达亿万;在众多的解决方案中,都会提到"prototype",
的确,要想使JAVASCRIPT支持面向对象,"prototype"功不可磨.在网上找到的许多优秀方案中,大多比较复杂,对于初学者的确有点难度,这里我提供了一个最轻量级的方案.
1,JAVASCRIPT面向对象要解决的几个问题
1.1 构造器,以及构造器参数问题,
1.2 类的属性问题,
1.3 类的方法问题,
1.4 类的事件问题,
1.5 类的继随问题,
1.6 类的命名空间问题,
1.7 类的统一注册问题,
1.8 类的统一实例问题,
从下面的c#类开始解决问题.
namespace PriceReader (命名空间)
{
/// <summary>
/// Summary description for Class1.
/// </summary>
public class Class1:Class2 //继承
{
public Class1()
{
//构造问题.
}
public void test() //方法 公共,私有,等等不同类型的方法.
{
}
}
}
以上面的C#的类,JAVASCRIPT怎么实现呢?
1,解决命名空间
在javascript里,所有的对象都是Object 的一个实例,我们可以用Object 对角来解决命名问题。
var regNamespace = Function.prototype.registerNamespace = function (namespaces)
{
var root = window;
var nsParts = namespaces.split('.');
for(var i=0;i<nsParts.length;i++)
{
var curPart = nsParts[i];
if(!root[curPart])
{
root[curPart] = new Object();
}
root = root[curPart];
}
}
上面的代码,利用object来产生命名空间,
用法
regNamespace("RSUN.Sys.UI");
2,解决继承,以及INTERFACE,ABSTRACT,等等类型的类.
Function.className = "-";
Function.classType = "class";
Function.baseClass = null;
Function.prototype.RegClass = function(className,baseClass)
{
this.className = className.trim();
if(baseClass)
{
this.baseClass = baseClass;
this.prototype = new baseClass;
}
}
Function.prototype.RegAbstractClass = function(className,baseClass)
{
this.RegClass(className,baseClass);
Function.classType = "abclass";
}
Function.prototype.RegInterface = function(interfaces)
{
this.RegClass(interfaces);
Function.classType = "interface";
}
上面的代码,我们解决了继承,以及不同类型的class的注册,在这里可以将interface看成是一种特殊的class.
综合实例:
regNamespace("RSUN.Sys.UI");
RSUN.Sys.UI = function()
{
this.name = "";
}
RSUN.Sys.UI.RegAbstractClass ('RSUN.Sys.UI');//注册抽象的类
RSUN.Sys.UI.CheckBox = function()
{
this.name = "chk1";
}
RSUN.Sys.UI.CheckBox.RegAbstractClass ('RSUN.Sys.UI.CheckBox',RSUN.Sys.UI)//注册类,并继承UI.
regNamespace("RSUN.Sys.UI");
RSUN.Sys.UI = function()
{
this.name = "";
}
RSUN.Sys.UI.RegAbstractClass ('RSUN.Sys.UI');//注册抽象的类
RSUN.Sys.UI.CheckBox = function()
{
this.name = "chk1";
}
RSUN.Sys.UI.CheckBox.RegAbstractClass ('RSUN.Sys.UI.CheckBox',RSUN.Sys.UI)//注册类,并继承UI.

浙公网安备 33010602011771号