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

Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
javascript(jquery)利用函数修改全局变量的代码
JQuery 解析多维的Json数据格式
javascript 按回车键相应按钮提交事件
深入认识javascript中的eval函数
jquery tree 可编辑节点实现代码(jquery一句话节点菜单)
js window.onload 加载多个函数的方法
MAC官方菜单纯CSS实现灰色会换色
CSS Filter背景透明提示
CSS鼠标悬停菜单 图片交换技术实现
纯JS图片批量预加载技术代码
实用的层滑开js实现代码
jQuery get和post 方法传值注意事项
JQuery打造PHP的AJAX表单提交实例
Jquery AJAX 框架的使用方法
基于JQuery框架的AJAX实例代码
jquery ajax 检测用户注册时用户名是否存在
javascript 限制输入脚本大全
JavaScript window.setTimeout() 的详细用法
JavaScript 表格高亮类的应用[高级]

Javascript 中的 JScript重载的另类实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 90 ::
收藏到网摘: 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是泣红亭"
其实这样子不算是真正的重载,而是先保存原来的成员为一个副本,然后改写该成员,在新成员代码中根据参数再判断是否调用旧成员代码。