当前位置: 首页 > 图文教程 > 网络编程 > Javascript > JScript重载的另类实现

Javascript
关于javascript document.createDocumentFragment()
javascript 有趣而诡异的数组
javascript 兼容鼠标滚轮事件
javascript mouseover、mouseout停止事件冒泡的解决方案
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
javascript 表格排序和表头浮动效果(扩展SortTable)
Cookie 注入是怎样产生的
javascript RadioButtonList获取选中值
javascript fullscreen全屏实现代码
常用简易JavaScript函数
用js实现的检测浏览器和系统的函数
File文件控件,选中文件(图片,flash,视频)即立即预览显示
js 获取键盘值用法(兼容IE及Firefox)
javascript 鼠标滚轮事件
javascript 原型模式实现OOP的再研究
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
javascript html 静态页面传参数
Firefox window.close()的使用注意事项
javascript removeChild 使用注意事项
js cookies 常见网页木马挂马代码 24小时只加载一次

Javascript 中的 JScript重载的另类实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 297 ::
收藏到网摘: n/a

JScript并不是面向对象的语言,只是基于对象。它没有重载这个概念,但通过一些技巧还是有办法从某种意义上实现重载。
首先定义一个基类TestA,该类重写了Object继承下来的toString方法。
注:toString方法是用于序列化对象,比如说alert(a)相当于alert(a.toString());

引用:
function TestA(Name)
{
this.Name = Name;
this.toString = function ()
{
return this.Name;
}
}
接下来我们实现一个TestA类的派生类TestB:
引用:
function TestB()
{
TestA.apply(this, arguments);
}
运行以下代码可以看出TestB已经继承下TestA的成员:
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

现在我们来给TestB添加一个自己的toString方法,但问题是如果定义了TestB的toString,那么TestA继承下来的toString就被覆盖了,我的做法是:在重写之前先保存下TestA的toString为TestB的_TestA_toString,然后在TestB的toString中根据参数来判断要调用_TestA_toString还是TestB自己的toString代码

引用:
function TestB()
{
TestA.apply(this, arguments);
this._TestA_toString = this.toString; // 保存下TestA的toString
this.toString = function(isTestB)
{
if(isTestB)
{
return "TestB的Name是" + this.Name;
}
else
{
return this._TestA_toString(); // 这里调用TestA的toString,即_TestA_toString
}
}
}
以上的toString不单单是TestB自己的toString,还根据参数情况调用了原来的toString,实现了重载。
最终代码是:

引用:
function TestA(Name)
{
this.Name = Name;
this.toString = function()
{
return this.Name;
}
}
function TestB()
{
TestA.apply(this, arguments);
this._TestA_toString = this.toString; // 保存下TestA的toString
this.toString = function(isTestB)
{
if(isTestB)
{
return "TestB的Name是" + this.Name;
}
else
{
return this._TestA_toString(); // 这里调用TestA的toString,即_TestA_toString
}
}
}
var B = new TestB("泣红亭");
alert(B);
alert(B.toString(true));
看看运行效果:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>测试代码</title>
</head>
<body>
<script>
function TestA(Name)
{
this.Name = Name;
this.toString = function()
{
return this.Name;
}
}
function TestB()
{
TestA.apply(this, arguments);
this._TestA_toString = this.toString; // 保存下TestA的toString
this.toString = function(isTestB)
{
if(isTestB)
{
return "TestB的Name是" + this.Name;
}
else
{
return this._TestA_toString(); // 这里调用TestA的toString,即_TestA_toString
}
}
}
var B = new TestB("泣红亭");
alert(B);
alert(B.toString(true));
</script>
</body>
</html>
提示:您可以先修改部分代码再运行
运行结果:

引用:
alert(B); // 即alert(B.toString()), 结果是"泣红亭"
alert(B.toString(true)) // 即isTestB为true,结果是"TestB的Name是泣红亭"
其实这样子不算是真正的重载,而是先保存原来的成员为一个副本,然后改写该成员,在新成员代码中根据参数再判断是否调用旧成员代码。