什么是继承啊?答:别人白给你的过程就叫继承。
为什么要用继承呢?答:捡现成的呗。
好吧,既然大家都想捡现成的,那就要学会怎么继承!
在了解之前,你需要先了解构造函数、对象、原型链等概念......
JS里常用的两种继承方式:
原型链继承:
var parent={
name : "baba"
say : function(){
alert("I am baba");
}
}
//新对象
var child = proInherit(parent);
//测试
alert(child.name); //"baba"
child.say(); //"I am baba"
利用proInherit(obj)方法,传入对象,就能实现对象的属性及方法的继承,这个方法不是内置方法,所以要自己定义,非常简单:
function F () {}
F.prototype = obj;
return new F();
}
其中F()为一个临时的空的构造函数,然后将F()的原型设置为父对象,但是同时它又通过受益于_proto_链接而具有其父亲对象的全部功能。
链式图解:
类式继承:
function Parent() {
this.name = "baba";
}
//父类原型方法
Parent.prototype.getName = function () {
return this.name;
}
//子类构造函数
function Child() {
this.name = "cc";
}
//类式继承
classInherit(Parent, Child);
//实例
var child = new Child();
alert(child.getName()) //“baba”
下面我们来看看这个继承的关键方法:classInherit(Parent,Child)
var F = function () { }
return function (P, C) {
F.prototype = P.prototype;
C.prototype = new F();
C.prototype.constructor = C;
}
}());
分析一下这个方法:
链式图解:
这种方式虽然在实例的时候继承了原型方法,但是父类的属性无法继承,下面介绍一种复制继承,算是对类式继承的补充。
复制继承:
function copyInherit(p, c) {
var i,
toStr = Object.prototype.toString,
astr = "[object Array]";
c = c || {};
for (i in p) {
if (p.hasOwnProperty(i)) {
if (typeof p[i] === "object") {
c[i] = toStr.call(p[i]) == astr ? [] : {};
c[i] = copy(p[i], c[i]);
}
else {
c[i] = p[i];
}
}
}
return c;
}
//重写Parent
function Parent() {
this.name = "pp";
this.obj= {a:1,b:2};
this.arr= [1, 2]
}
//实例
var child = new Child();
var parent = new Parent();
copyInherit(parent, child);
alert(child.name) //"baba"
alert(child.arr) //1,2
alert(child.obj.a) //1
分析下copyInherit(p,c)
当一个值赋予一个变量时候,分为传值和传引用两种方式,当你父对象内属性包含数组类型或是对象类型时候, c[i] = toStr.call(p[i]) == astr ? [] : {};这一句会避免修改子对象属于而引起的父对象属性被篡改。
总结:
类式继承比较普遍,因为大家都比较熟悉这种构造函数方式,但是内存占用比较大。而原型式继承,占用内存比较小,但是包含数组,或者对象类型的克隆比较麻烦。复制继承简单,而且应用广泛。
本文链接
<%
'-----------------------------------------------------------------------
'--- 上传处理类模块
'--- Copyright (c) 2004 Aspsky, Inc.
'--- Mail: Sunwin@artbbs.net http://www.aspsky.net
'--- 2004-12-18
'-----------------------------------------------------------------------
'-----------------------------------------------------------------------
'-- InceptFileType : 设置上传类型属性 (以逗号分隔多个文件类型) String
'-- MaxSize : 设置上传文件大小上限 (单位:kb) Long
'-- InceptMaxFile : 设置一次上传文件最大个数 Long
'-- UploadPath : 设置保存的目录相对路径 String
'-- UploadType : 设置上传组件类型 (0=无组件上传类,1=Aspupload3.0 ,2=SA-FileUp 4.0 ,3=DvFile.Upload V1.0)
'-- SaveUpFile : 执行上传
'-- GetBinary : 设置上传是否返回文件数据流 Bloon值 : True/False
'-- ChkSessionName : 设置SESSION名,防止重复提交,SESSION名与提交的表单名要一致。
'-- RName设置文件名 : 定义文件名前缀 (如默认生成的文件名为200412230402587123.jpg
' 设置:RName="PRE_",生成的文件名为:PRE_200412230402587123.jpg)
'-----------------------------------------------------------------------
'-- 设置图片组件属性
'-- PreviewType : 设置组件(0=CreatePreviewImage组件,1=AspJpegV1.2 ,2=SoftArtisans ImgWriter V1.21)
'-- PreviewImageWidth : 设置预览图片宽度
'-- PreviewImageHeight : 设置预览图片高度
'-- DrawImageWidth : 设置水印图片或文字区域宽度
'-- DrawImageHeight : 设置水印图片或文字区域高度
'-- DrawGraph : 设置水印图片或文字区域透明度
'-- DrawFontColor : 设置水印文字颜色
'-- DrawFontFamily : 设置水印文字字体格式
'-- DrawFontSize : 设置水印文字字体大小
'-- DrawFontBold : 设置水印文字是否粗体
'-- DrawInfo : 设置水印文字信息或图片信息
'-- DrawType : 设置加载水印模式:0=不加载水印 ,1=加载水印文字 ,2=加载水印图片
'-- DrawXYType : 图片添加水印LOGO位置坐标:"0" =左上,"1"=左下,"2"=居中,"3"=右上,"4"=右下
'-- DrawSizeType : 生成预览图片大小规则:"0"=固定缩小,"1"=等比例缩小
'-----------------------------------------------------------------------
'-- 获取上传信息
'-- ObjName : 采用的组件名称
'-- Count : 上传文件总数
'-- CountSize : 上传总大小字节数
'-- ErrCodes : 错误NUMBER (默认为0)
'-- Description : 错误描述
'-----------------------------------------------------------------------
'-- CreateView Imagename,TempFilename,FileExt
' 创建预览图片过程: 原始文件的相对路径,生成预览文件相对路径,原文件后缀
'-----------------------------------------------------------------------
'-----------------------------------------------------------------------
'-- 获取文件对象属性 : UploadFiles
'-- FormName : 表单名称
'-- FileName : 生成的文件名称
'-- FilePath : 保存文件的相对路径
'-- FileSize : 文件大小
'-- FileContentType : ContentType文件类型
'-- FileType : 0=其它,1=图片,2=FLASH,3=音乐,4=电影
'-- FileData : 文件数据流 (若组件不支持直接获取,则返回Null)
'-- FileExt : 文件后缀
'-- FileWidth : 图片/Flash文件宽度 (其他文件默认=-1)
'-- FileHeight : 图片/Flash文件高度 (其他文件默认=-1)
'-----------------------------------------------------------------------
'-----------------------------------------------------------------------
'-- 获取表单对象属性 : UploadForms
'-- Count : 表单数
'-- key : 表单内容
'-----------------------------------------------------------------------
'-----------------------------------------------------------------------
Class UpFile_Cls
Private UploadObj,ImageObj
Private FilePath,InceptFile,FileMaxSize,MaxFile,Upload_Type,FileInfo,IsBinary,SessionName
Private Preview_Type,View_ImageWidth,View_ImageHeight,Draw_ImageWidth,Draw_ImageHeight,Draw_Graph
Private Draw_FontColor,Draw_FontFamily,Draw_FontSize,Draw_FontBold,Draw_Info,Draw_Type,Draw_XYType,Draw_SizeType
Private RName_Str,Transition_Color
Public ErrCodes,ObjName,UploadFiles,UploadForms,Count,CountSize
'-----------------------------------------------------------------------------------
'初始化类
'-----------------------------------------------------------------------------------
Private Sub Class_Initialize
SessionName = Empty
IsBinary = False
ErrCodes = 0
Count = 0
CountSize = 0
FilePath = "./"
InceptFile = ""
FileMaxSize = -1
MaxFile = 1
Upload_Type = -1
Preview_Type = 999
ObjName = "未知组件"
View_ImageWidth = 0
View_ImageHeight = 0
Draw_FontColor = &H000000
Draw_FontFamily = "Arial"
Draw_FontSize = 10
Draw_FontBold = False
Draw_Info = "WWW.OIOJ.NET"
Draw_Type = -1
Set UploadFiles = Server.CreateObject ("Scripting.Dictionary")
Set UploadForms = Server.CreateObject ("Scripting.Dictionary")
UploadFiles.CompareMode = 1
UploadForms.CompareMode = 1
End Sub
'-----------------------------------------------------------------------------------
'销毁类
'-----------------------------------------------------------------------------------
Private Sub Class_Terminate
If IsObject(UploadObj) Then
Set UploadObj = Nothing
End If
If IsObject(ImageObj) Then
Set ImageObj = Nothing
End If
UploadFiles.RemoveAll
UploadForms.RemoveAll
Set UploadForms = Nothing
Set UploadFiles = Nothing
End Sub
'-----------------------------------------------------------------------------------
'设置上传是否返回文件数据流
'---------
J2EE是为企业级应用开发者设计的庞大工具包,对Java核心规范在大小和广度上都有巨大的扩展。是对现有和新技术的集成,可以大幅度加速应用开发。
J2EE是一个标准、规范。遵循此规范开发的应用可以做到编写一次,随处运行,实现跨平台运行。一下是这十三种规范,对于规范,我更多的以我自己目前已有的知识来解读一下。
1.JDBC(Java Database Connectivity)
名字都和ODBC(Open Database Connectivity)那么相像,给人的第一感觉就是他们要实现的功能差不多,但事实并非仅仅是换了一个字母那么简单。我觉得可以这样理解JDBC:是ODBC与ADO的结合体,创建连接和发送SQL只用JDBC一个就行了,而ODBC只是创建一个连接,还需要用ADO来进行数据操作。
2.JNDI(Java Name and Directory Interface)
名字为Java名字和路径的接口,对于这个的理解目前还不是那么深刻。部署EJB、DataSource等,为其提供一个JNDI-NAME,那么在程序中,就可以通过lookup查找这个唯一ID,就可以获得到相应的资源,而这个资源,可以不是本地文件系统中的,这就为分布式的系统打下了很好的基础。
我感觉这个就像一个k-v对,名字为key,而value是任意对象。
3.EJB(Enterprise Javabean)
Javabean的任务是:一次性编写,任何地方执行,任何地方重用。Javabean分为会话Bean(无会话状态的Bean,有会话状态的Bean)、实体Bean、消息驱动Bean。
关于实体Bean,我感觉很像三层里面的DAL+Entity。只不过,在这里,Bean可以由容器实现,也可以由Bean自己实现。由容器实现,在使用过程中,感觉很像为某个空间设置数据源,只需要通过自己选择一下,语句就可以出来。而有Bean自己控制的Bean,感觉就很像三层里面的DAL+Entiry了。
会话Bean,可以作为三层架构中的业务逻辑层出现。而消息驱动Bean,更多的是用在了JMS(Java massage Service)中。
4.RMI(Remote Method Invoke)
远程方法请求。名如其实,这个是用来调用远程方法的。使用序列化的方式在客户端与服务器之间传递数据,是呗EJB使用的更底层的协议。
5、Java IDL/CORBA(待日后深入理解)
JavaIDL使分布式、支持Web的Java应用可以给予IIOP协议透明地调用远程服务
6、JSP
JSP页面由HTML代码嵌入其中Java代码组成。怎么嵌入先不管,吃饭理论,ASP学过,这里只变了一个字母,而且要达到的目的也都一样:页面展示。所以对于这个的理解不是那么难。
7、Servlet
其实看到这个的时候,我深深感觉到米老师对于各种语言看法的正确性了:语言其实是相同的,真正学会了一门语言,学会另一门语言真的不用多久。不知道大家还记不记得.net平台中的一般处理程序。
我在学习AJAX的时候,看的是Java版的,里面说让建一个servlet,当时把我给愁的够呛。后来我建了一个一般处理程序,发现结构和servlet差不多,于是就把卸载servlet中的语句写在了一般处理程序中,发现正常执行了。
所以从.net平台转过来,我觉得可以这将上面两个对应到已学的知识:Asp页面——jsp页面,servlet——一般处理程序。这样,jsp对你来说的新鲜感是不是就小了很多了。
8.XML(Extensible Markup Language)
扩展标记语言。这个在学习asp.net的时候,就接触过,只是到现在了,依然没有深入用过。XML是平台独立的,和Java的发展也是相互独立的。正是由于XML的平台独立,使得java的跨平台有了强力的后盾。
9JMS(java message service)
看了这部分,第一感觉就是,刚刚做的那个系统,如果用上这个机制,那么会更完美。
点对点互发,消息广播。还可以这样设置:如果对方没有在线,那么消息会存在服务器,待对方上线后,发送给对方。其实这个自己新增个表,其实也可以实现,但是你不好实现的是优化,如果面对大数据量,你无法保证是否会像你使用JMS那样高效。
10.JTA(java transaction API)
java事务API。这点,在.net平台中也是有的(ADO事务)。事务,可以由容器控制,也可以由bean控制。
在学习数据库的时候,第一次接触了事务这一个词,事务最简单最直接的目的就是保证数据的有效性,数据的一致性。
11.JavaMail
用于存取邮件服务器的API,提供了一包邮件服务器的抽象类。不仅支持SMTP服务器,也支持IMAP服务器。
12、13.JTA和JTS
Java事务API和Java事务服务未J2EE平台提供了分布式事务服务。
对于J2EE的理解还有待进一步的研究,下一步要通过一个项目来对J2EE的知识进行深入以及巩固。纸上学来终觉浅,在项目中成长是IT人学习的法宝。
最后,再说一下对于三层架构的看法。忘了听谁说过,MVC不是架构,只是几个设计模式而已。可是学习的过程中,老师说了一个外观模式:业务逻辑放在会话Bean用来减小Web与实体Bean的耦合,当时看了一下,这不就是我们每天津津乐道的三层架构么。
再发表语句对设计模式的看法:有的设计模式,是架构级别的。架构,是设计模式的体现。