Asp.Net Ajax 学习笔记12 基于Microsoft AJAX Library扩展客户端组件
来源:互联网 发布:软件可靠性是指 编辑:程序博客网 时间:2024/06/06 10:51
1、C#中定义事件的方法
- 第一种:逐个定义事件 public class WorkEventArgs : EventArgs
...{
/**//* ...*/
}
public class SomeClass
...{
public event EventHandler<WorkEventArgs> Work;
protected void OnWork(WorkEventArgs e)
...{
if (Work != null) Work(this, e);
}
} - 第二种:事件集合的方式 public class SomeClass
...{
static readonly object workEventKey = new object();
protected EventHandlerList eventDelegates = new EventHandlerList();
public event EventHandler<WorkEventArgs> Work
...{
add
...{
this.eventDelegates.AddHandler(workEventKey, value);
}
remove
...{
this.eventDelegates.RemoveHandler(workEventKey, value);
}
}
protected void OnWork(WorkEventArgs e)
...{
EventHandler<WorkEventArgs> workEventDelegates =
(EventHandler<WorkEventArgs>)this.eventDelegates[workEventKey];
if (workEventDelegates != null) workEventDelegates(this, e);
}
//…
}
2、Asp.Net Ajax里面的事件
Asp.Net Ajax事件的定义与第二种差不多
- 定义委托List Demo.MyClass = function()
...{
this._events = new Sys.EventHandlerList();
// …
} - 定义事件的add和remove Demo.MyClass.prototype=
...{
add_myEvent : function(handler)
...{
this._events.addHandler("myEvent", handler);
},
remove_myEvent : function(handler)
...{
this._events.removeHandler("myEvent", handler);
},
// ...
} - 添加触发事件的方法 Demo.MyClass.prototype =
...{
raiseMyEvent : function(e)
...{
var handler = this._events.getHandler("myEvent");
if (handler)
...{
handler(this, e);
}
}
}
3、继承时需要注意的问题
在Asp.Net Ajax中toLocaleString, valueOf, hasOwnProperty等方法都无法继承。通过重写Type的resolveInheritance方法解决
<script language="javascript" type="text/javascript">
//重写TyperesolveInheritance方法,就是解决继承的方法
Type.prototype.resolveInheritance = function Type$resolveInheritance()
...{
if (arguments.length !== 0) throw Error.parameterCount();
if (this.__basePrototypePending)
...{
var baseType = this.__baseType;
baseType.resolveInheritance();
for (var memberName in baseType.prototype) ...{
var memberValue = baseType.prototype[memberName];
if (!this.prototype[memberName]) ...{
this.prototype[memberName] = memberValue;
}
}
//定义一个不能继承方法的方法名的数组
var dontEnumMembers = ["toString", "toLocaleString",
"valueOf", "hasOwnProperty", "isPrototypeOf",
"propertyIsEnumerable"];
//遍历这个数组
for (var i = 0; i < dontEnumMembers.length; i++)
...{
var memberName = dontEnumMembers[i];
//如果这个类的这个方法已经定义,就不用理会
if (this.prototype[memberName] != Object.prototype[memberName])
...{
continue;
}
//如果这个类的这个方法没有定义,得到基类这个方法的值
var memberValue = baseType.prototype[memberName];
//如果memberValue存在,就是基类的方法存在,并且不等于所有类的基类Object的
//的这个方法
if (memberValue != Object.prototype[memberName])
...{
//将基类的这个方法付给子类,那么子类就继承了基类的这个方法
this.prototype[memberName] = memberValue;
}
}
delete this.__basePrototypePending;
}
}
</script>
//重写TyperesolveInheritance方法,就是解决继承的方法
Type.prototype.resolveInheritance = function Type$resolveInheritance()
...{
if (arguments.length !== 0) throw Error.parameterCount();
if (this.__basePrototypePending)
...{
var baseType = this.__baseType;
baseType.resolveInheritance();
for (var memberName in baseType.prototype) ...{
var memberValue = baseType.prototype[memberName];
if (!this.prototype[memberName]) ...{
this.prototype[memberName] = memberValue;
}
}
//定义一个不能继承方法的方法名的数组
var dontEnumMembers = ["toString", "toLocaleString",
"valueOf", "hasOwnProperty", "isPrototypeOf",
"propertyIsEnumerable"];
//遍历这个数组
for (var i = 0; i < dontEnumMembers.length; i++)
...{
var memberName = dontEnumMembers[i];
//如果这个类的这个方法已经定义,就不用理会
if (this.prototype[memberName] != Object.prototype[memberName])
...{
continue;
}
//如果这个类的这个方法没有定义,得到基类这个方法的值
var memberValue = baseType.prototype[memberName];
//如果memberValue存在,就是基类的方法存在,并且不等于所有类的基类Object的
//的这个方法
if (memberValue != Object.prototype[memberName])
...{
//将基类的这个方法付给子类,那么子类就继承了基类的这个方法
this.prototype[memberName] = memberValue;
}
}
delete this.__basePrototypePending;
}
}
</script>
不要在基类的构造函数中写toString方法
Demo.Parent = function()
...{
// Incorrect
this.toString = function()
...{
return Object.getTypeName(this);
}
}
...{
// Incorrect
this.toString = function()
...{
return Object.getTypeName(this);
}
}
这样做为什么不行,因为你在派生类定义一个toString方法是无法覆盖基类的toString的方法的,这违背了继承的原则。
3、修改已有类型
- 添加某个类的成员直接可以在他的prototype上添加方法
- 修改某个成员需要先备份修改等方法,然后定义同名方法 var p = Demo.Employee.prototype;
p._old_calculateSalary = p._calculateSalary;
p._calculateSalary = function()
...{
return this._old_calculateSalary() + (this.get_year() - 1) * 2000;
}
- Asp.Net Ajax 学习笔记12 基于Microsoft AJAX Library扩展客户端组件
- Asp.Net Ajax 学习笔记23 利用Microsoft AJAX Library开发客户端组件(上)
- Asp.Net Ajax 学习笔记24 利用Microsoft AJAX Library开发客户端组件(中)
- Asp.Net Ajax 学习笔记25 利用Microsoft AJAX Library开发客户端组件(下)
- Asp.Net Ajax 学习笔记14 扩展Microsoft AJAX Library的异步通信层
- (学习Asp.net Ajax笔记一)使用 Microsoft AJAX Library 创建自定义客户端脚本之一
- Asp.Net Ajax 学习笔记9 JavaScript的原生类型以及Microsoft AJAX Library的相关扩展(上)
- Asp.Net Ajax 学习笔记10 JavaScript的原生类型以及Microsoft AJAX Library的相关扩展(下)
- ASP.NET - 使用 Microsoft AJAX Library 创建自定义客户端脚本
- Asp.Net Ajax 学习笔记11 Microsoft AJAX Library中的面向对象类型系统
- Asp.Net Ajax 学习笔记13 Microsoft AJAX Library中异步通信层使用
- Asp.Net Ajax 学习笔记22 使用Microsoft Ajax Library中的浏览器兼容功能
- 《ASP.NET AJAX程序设计——第II卷:客户端Microsoft AJAX Library相关》前言
- ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)
- ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)
- 客户端Microsoft AJAX Library相关
- Asp.Net Ajax 学习笔记16 Profile Service扩展方式
- Asp.Net Ajax 学习笔记6 客户端访问WebService(上)
- Windows服务调用机制
- C程序优化之路
- 内联汇编基础知识
- 字节对齐(ZZ)
- StringBuilder简介!
- Asp.Net Ajax 学习笔记12 基于Microsoft AJAX Library扩展客户端组件
- 开BLOG纪念
- DataTable使用方法!
- 老鼠自卑的心结分析以及解决办法
- 【转载】从程序员到非程序员之博客篇
- 少走弯路的十条忠告
- Linux下的多线程编程
- 用WPF 做了一个简单的太阳系
- 用程序表达的有隔断的盒子——线性表(C++)