javascript面向对象编程(三)
作者:canque 来源:CanQue@RSSIDEA 发布时间:2008-03-07 13:19:00
标签:面向对象,编程,oop,javascript
阅读上一篇:javascript面向对象编程(二)
[Interface,Class.implement 接口及实现]
接口规定了一些方法,如果一个类实现了接口所定义的所有方法,就叫做实现了这个接口。诚然,javascript来模拟接口会带来一些效率上的损失,但是在大型项目特别是团队开发的时候,接口将带来很大的方便。使项目代码更加规范,更方便地查找错误信息。很多设计模式,像工厂模式、合成模式、装饰模式、命令模式等都依赖于接口来实现。
javascript模拟接口包括两部分:接口的模拟和接口实现的模拟。
[Interface接口类]
这段代码定义一个接口类,同样来自于《javascript design patterns》,略有改动。
// Constructor.
var Interface = function(name, methods){
if (arguments.length != 2) {
throw new Error("Interface constructor called with " + arguments.length +
"arguments, but expected exactly 2.");
}
this.name = name;
this.methods = [];
for (var i = 0, len = methods.length; i <len; i++) {
if (typeof methods[i] !== 'string') {
throw new Error("Interface constructor expects method names to be " +
"passed in as a string.");
}
this.methods.push(methods[i]);
}
};
[Interface.ensureImplements 接口实现检查]
这段代码检查一个对象是否实现了所要实现接口。
// Static class method.
Interface.ensureImplements = function(object){
if (arguments.length <2) {
throw new Error('Interface.ensureImplements:Wrong arguments number');
}
for (var i = 1, len = arguments.length; i <len; i++) {
var interfaces = arguments[i];
if (interfaces.constructor !== Interface) {
throw new Error("Function Interface.ensureImplements expects arguments " +
"two and above to be instances of Interface.");
}
for (var j = 0, methodLen = interfaces.methods.length; j <methodLen; j++) {
var method = interfaces.methods[j];
if (!object.prototype[method] || typeof(object.prototype[method]) !== 'function') {
throw new Error("Function Interface.ensureImplements: object " +
"does not implement the " +
interfaces.name +
" interface. Method " +
method +
" was not found.");
}
}
}
}
[Class.implement类实现接口]
接口定义后,还不能带来任何好处,需要在类中体现出来。看下面的两段代码就很清楚了:程序演示页面(3)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script language="JavaScript" src="http://rssidea.com/labs/OOP/OOP.js"></script>
<title>labs@RSSIDEA javascript OOP</title>
</head>
<body>
<script language="JavaScript">
//定义一个computer的接口,要求实现motherborad,memory,cpu,harddisk的方法。
var computer = new Interface('computer', ['motherboard', 'memory', 'cpu', 'harddisk'])
//定义一个PC类,实现computer接口
var PC = Class.create({
motherboardInfo: '',
memoryInfo: '',
cpuInfo: '',
harddiskInfo: '',
init: function(motherboard, memory, cpu, harddisk){
this.motherboardInfo = motherboard;
this.memoryInfo = memory;
this.cpuInfo = cpu;
this.harddiskInfo = harddisk;
},
motherboard: function(){
return this.motherboardInfo;
},
memory: function(){
return this.memoryInfo;
},
cpu: function(){
return this.cpuInfo;
},
mouse:function(){
return this.mouseInfo;
}
}).implement(computer);//浏览器报错,(没有硬盘电脑怎么转啊?)
var myComputer = new PC('微星主板', '现代2G', 'AMD3600+', '三星80G');
//输出电脑配置信息
trace(myComputer);
</script>
</body>
</html>
但是这段代码我们却得到一个浏览器错误,方法harddisk没有实现。(没有硬盘叫什么电脑啊?)
好吧,好吧!我承认是我拿买硬盘的钱去买了一个鼠标……(这鼠标不错吧?)
我原以为可以混过去,却被检查出来了。接口的工作和作用和上面的情况类似。现在,我需要再买个硬盘(harddisk)。程序演示页面(4)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script language="JavaScript" src="http://rssidea.com/labs/OOP/OOP.js"></script>
<title>labs@RSSIDEA javascript OOP</title>
</head>
<body>
<script language="JavaScript">
//定义一个computer的接口,要求实现motherborad,memory,cpu,harddisk的方法。
var computer = new Interface('computer', ['motherboard', 'memory', 'cpu', 'harddisk'])
//定义一个PC类,实现computer接口
var PC = Class.create({
motherboardInfo: '',
memoryInfo: '',
cpuInfo: '',
harddiskInfo: '',
init: function(motherboard, memory, cpu, harddisk){
this.motherboardInfo = motherboard;
this.memoryInfo = memory;
this.cpuInfo = cpu;
this.harddiskInfo = harddisk;
},
motherboard: function(){
return this.motherboardInfo;
},
memory: function(){
return this.memoryInfo;
},
cpu: function(){
return this.cpuInfo;
},
mouse:function(){
return this.mouseInfo;
},
harddisk:function(){
return this.harddiskInfo;
}//这是新买的硬盘
}).implement(computer);//实现了computer接口
var myComputer = new PC('微星主板', '现代2G', 'AMD3600+', '三星80G');
//输出电脑配置信息
trace(myComputer);
</script>
</body>
</html>
太好了!浏览器不再报错,这样,我们就实现了computer接口。
0
投稿
猜你喜欢
- 我们可用正规表达式来寻找并替换URL和邮件地址为活动的超级链接。用到的主要函数就是InsertHyperlinks(inText),语法为:
- 想必每个DBA都喜欢挑战数据导入时间,用时越短工作效率越高,也充分的能够证明自己的实力。实际工作中有时候需要把大量数据导入数据库,然后用于各
- 使用jmail组件发送邮件:Function JMail(Send_From,Send_To,Send_Subject,Send_
- What? 什么是面包屑面包屑是作为辅助和补充的导航方式(secondary navigation scheme),它能让用户知道在网站或应
- 一、问题描述 SQL Plus WorkSheet是一个窗口图形界面的SQL语句编辑器,对于那些喜欢窗口界面而不喜欢字符界面的用户,该工具相
- 有些时候(如开发聊天程序),我们需要将将滚动条(scrollbar)保持在最底部,比如聊天窗口,最新发出和收到的信息要显示在最下方,如果要看
- 简介Closure所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭
- 怎么增大MySQL数据库连接数,MYSQL数据库安装完成后,默认连接数是100,流量稍微大一点的论坛或网站这个连接数是不够哟用
- 一、问题引发思考前阵子与同事探讨一个小需求时又遇到了按钮表示“动作”和表示“状态”间矛盾问题。想想这个问题多年前已经开始讨论了,所以在此整理
- 其实网上已经有很多ASP生成htm的文章了,有一种方法是ASP+XML的生成方法,虽然有一种好处就是不用程序写模版就可以直接引用原来的要生成
- 首先建一个access 数据库,库中有一个URLINDEX表,其中URL和Keywords字段分别添加了索引,如下:URL &nb
- 一、利用ASP和ADO实现数据库操作的工作流程ASP内嵌了五个对象Resquest、Response、Server、Seesion、Appl
- 大家都熟悉迅雷看看里面的电影人气指数这个小图标吧先看看我的效果图再看看迅雷的截图比较好看,是根据电影的人气指数来显示热度,下面我们就来模仿一
- SQL Server 阻止了对组件 'Ad Hoc Distributed&nbs
- JavaScript中的64位加密及解密的两个方法。function base64Encode(text){if (/(
- 1969年8月8日,在北京协和医院降生了一个漂亮的小女孩。接生的阿姨说,她的声音这么大,好象想要全世界的人都听到。后来,她的父亲为她取了一个
- 简介CSS Sprites并没有一个确定的中文翻译,通常被意译为“CSS图像拼合”或“CSS贴图定位”。CSS Sprites并不是一门新技
- 以用户为中心的设计、用户体验,这两个词现在在互联网上几乎随处可见,除了设计师外,很多的用户也都在说这两个词,于是我们经常会听到诸如“这里用户
- asp使用WScript.Shell获取电脑的网络配置信息Option Explicit Dim WSHShe
- 如何修改NT的登录密码? 代码见下:<%Sub ChangeUserPassword(C