由prototype_1.3.1进入javascript殿堂-类的初探


Posted in Javascript onNovember 06, 2006

还是决定冠上ajax的头衔,毕竟很多人会用这个关键词搜索。虽然我认为这只是个炒作的概念,不过不得不承认ajax叫起来要方便多了。ajax的意思我就不详细解释了。

写这个教程的起因很简单:经过一段时间的ajax学习,有一些体会,并且越发认识到ajax技术的强大,所以决定记录下来,顺便也是对自己思路的整理。

前几年,javascript在一般人眼里,功能还很狭窄,所能做的要么是一些简单的表单验证,要么是许多华而不实的网页特效。随着flash的出现,大家已经不像以前那样热衷于js特效。似乎js能做的事情更加少了。但这时候,ajax的概念冒了出来,以gmail为典型代表的ajax应用受到很多人的关注,ajax一下子成为一种很热门的技术,当javascript和xml,和dom模型结合起来,其所能做的事情常常令人匪夷所思,甚至有些功能已经可以和桌面程序相当。

好了废话就不多说了,现在就从一个javascript的开发框架prototype_1.3.1(下面简称为prototype)开始。我本来是想先介绍一下javascript的高级应用,但怕水平不够,说的没有条理,所以就结合prototype来说,顺便会提及js的语法使用。
下面是框架最前面的两段代码:

var Prototype = {
  Version: '1.3.1',
  emptyFunction: function() {}
}
var Class = {
  create: function() {
    return function() { 
      this.initialize.apply(this, arguments);
    }
  }
}
首先,让我们来看下面两个语法的区别:

var o={};
var f=function(){};

后面一个很容易理解,它等价于function f(){};定义一个函数f。但前面一个就不常见了:这其实是创建一个对象,在{}中可以指定对象的成员,比如上面的Prototype,就是一个对象,有两个成员,第一个是版本号,第二个是一个空方法(函数)。像这种不用定义类,就能直接创建对象的功能可能只有js能做到。后面一种语法其实还有一个功能,就是定义一个类f。如果你在函数体中用了this,那么this后面的变量就是类的成员。
不仅this可以定义类成员,还有一种语法:

function c(){
member1:value,
member2:function(){}
}

这等价于:

function c(){
this.member1=value;
this.member2=function(){};
}

需要注意的是,用前一种办法时,最后一个成员的最后不能加逗号,我想这种语法应该和数组有关。

在js里,函数和类是没有区别的,都可以new,new的作用是把函数体的语句都执行一遍,然后返回一个对象。如果函数里有this,那么this后面的变量会作为对象成员;如果没有,那么new的作用只是返回一个没有任何成员的空对象。所以你用typeof查看一个所谓类的类型时,仍然会返回function。在js里也基本没有类型的概念,所有变量的声明都用var,即使是函数,也是如此。函数,其实也只是一个变量。

说函数是变量,可能很多人不解。但是你试试下面的做法:

function fTest(){
var a=1;
alert(a);
}
alert(fTest);

你会发现显示的是fTest这个函数的函数体,所以我们可以认为,所谓函数,仅仅是js引擎可以解析的一段代码字符串。函数名变量存储的只是这个字符串。说的更准确一点,函数名是一个指针变量,它存储的是这个代码字符串在内存中的位置。这样就不难理解将函数作为参数传递,可以作为值返回了,这是以后会大量使用的技术。因为类也是函数,所以理解了函数,也就理解了类。

虽然在js里函数和类没有区别,但是类的概念却可以方便我们进行程序设计,于是prototype很有创意的创建了一个全局对象Class:

var Class = {
  create: function() {
    return function() { 
      this.initialize.apply(this, arguments);
    }
  }
}

Class是一个全局对象,它的唯一方法就是create,作用返回一个函数,前面已经讲过函数作为返回值的机制,这里不再遨述。返回的函数包括一条语句:

this.initialize.apply(this, arguments);

前面讲过,new一个函数时,会执行函数里的代码,最后返回对象。所以当使用Class.create()创建了一个函数,再new这个返回的函数时,首先会执行这条语句。后面可以看到,这其实是为了调用类的构造函数。

就是这样,Class成为了整个prototype的类型创建模型,并且能很好的把类和函数在代码上区分开来。Class.create()仅仅是返回一个空类,而且它会默认为这个类是具有initialize方法的,所以要使用这个类,至少需要有一个构造函数,这就需要使用到类的继承。类只是一个函数,那么函数怎么继承呢?看起来匪夷所思,javascript能做到这一点,prototype使得实现更为优雅,至于它是怎么做到的,且听下回分解。

Javascript 相关文章推荐
Jquery 表单取值赋值的一些基本操作
Oct 11 Javascript
jQuery实现单行文字间歇向上滚动源代码
Jun 02 Javascript
javascript 得到文件后缀名的思路及实现
May 09 Javascript
使用JS CSS去除IE链接虚线框的三种方法
Nov 14 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
Jan 05 Javascript
分析了一下JQuery中的extend方法实现原理
Feb 27 Javascript
jquery实现移动端点击图片查看大图特效
Sep 11 Javascript
详解react-webpack2-热模块替换[HMR]
Aug 03 Javascript
微信小程序日期选择器实例代码
Jul 18 Javascript
vue interceptor 使用教程实例详解
Sep 13 Javascript
如何安装控制器JavaScript生成插件详解
Oct 21 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 Javascript
javascript读取xml
Nov 04 #Javascript
用javascript操作xml
Nov 04 #Javascript
一个加密JavaScript的开源工具PACKER2.0.2
Nov 04 #Javascript
破除一些网站复制、右键限制
Nov 04 #Javascript
js计数器代码
Nov 04 #Javascript
Js中sort()方法的用法
Nov 04 #Javascript
取得传值的函数
Oct 27 #Javascript
You might like
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
js实现百度淘宝搜索功能
2020/02/17 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
python 下载文件的多种方法汇总
2020/11/17 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
出纳岗位职责范本
2013/12/01 职场文书
英文简历中的自荐信范文
2013/12/14 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
英语教师个人总结
2015/02/09 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server