编写一个JS组件来说说call和apply的用法(4)
作者:ComPhilip 来源:经典论坛 发布时间:2008-11-23 17:11:00
现在我们说说这里为什么要用apply。
其实这里大可以不用apply,因为我们可以通过修改_raiseInvalidTypeEvent和_raiseOverflowEvent方法的声明,使它有两个参数,分别传递类对象和ext对象。有这两个对象,它们完全可以完成任务(什么任务,等一下说)。但我为什么要在这里apply改变上下文呢。其实是为了缩小this指向非类对象的范围。通过apply,我们立刻把函数的上下文改为类对象,使指向非类对象的this仅仅存在于_checkValue。这样,对于自己以后的修改,检查错误,提供了方便。那么为什么要用apply传递ext呢?使用call抛弃它不行吗?——这个当然行啦,我之所以用apply是为了保留额外的事件信息,使用类的人可能用到也说不定。
现在看看_raiseInvalidTypeEvent和_raiseOverfowEvent
_raiseInvalidTypeEvent : function(ext){//触发非法数据类型事件
var cancel = false;
for(var i=0;i<this._invalidTypeHandler.length;i++)
cancel = this._invalidTypeHandler[i].apply(this,[ext]);
if(cancel)
this._dom.focus(); //获得焦点
},
_raiseOverflowEvent : function(ext){//触发溢出事件
var cancel = false;
for(var i=0;i<this._overflowHandler.length;i++)
cancel = this._overflowHandler[i].apply(this,[ext]);
if (cancel)
this._dom.focus();
},
其实这两个类功能一样。它们都是遍历整个函数指针数组,然后,逐个调用。这里才是apply真正的用法。
我们为什么要把类对象作为函数上下文呢?因为使用这个类的人,在外部可以通过this来访问类的方法来获取组件的接口(属性)。他们往往不在乎这个组件的其他信息(如构成这个组件的HTML代码),他们只想要知道用户输入的值。更何况这个值已转化成数字,而不是原来的字符串,那么就更方便他们的使用。
我们还要留意那个cancel变量,它是处理函数的返回值。要注意它是最后一个处理函数的返回值,因为后一个处理函数的返回值会覆盖前一个处理函数的访回值。这个cancel是根据处理函数返回的值来决定是否让文本框获得焦点。如果为true,则获得焦点,实际上是不让用户转移,直到他输入一个合法数据为止。如果为false,则用户可能留下一个非法的数据。
那看看如何使用这个类:
首先是声明三个处理函数:
function invalid1(ext){
alert("valid1\n当前值为:"+this.getValue()); //调用了类对象的getValue方法
}
function invalid2(ext){
alert("valid2,测试多处理函数和保留焦点");
return true; //保留焦点
}
function overflow(ext){
alert("输入的值必须在"+this.getMin()+"和"+this.getMax()+"之间");
return true;
}
然后是实例化NumTextBox类
var test = new NumTextBox("test",18,60);
接着是把处理函数绑定到类的事件中:
test.AddInvalidTypeEventHandler(invalid1);//添加非法数据类型事件处理函数
test.AddInvalidTypeEventHandler(invalid2);
test.AddOverflowEventHandler(overflow);//添加溢出事件处理函数
这样就可以了。实际的使用就是如此简单。可重用性大大增强


猜你喜欢
- typeof都返回object在JavaScript中所有数据类型严格意义上都是对象,但实际使用中我们还是有类型之分,如果要判断一个变量是数
- 本文实例讲述了Python3.5 Pandas模块缺失值处理和层次索引。分享给大家供大家参考,具体如下:1、pandas缺失值处理impor
- 今天咱写一个挺实用的工具,就是扫描并获取可用的proxy首先呢,我先百度找了一个网站:http://www.xicidaili.com 作为
- SQL 联合查询与XML解析实例
- 1.需求描述编写一个 Python 程序,每次下载压缩包形式的文件后,自动将内部文件解压到当前文件夹后将压缩包删除,通过本案例可以学到的知识
- 用的pytorch来训练deeplabv3+在做deeplabv3+的过程中,我的训练图片是8位的,如下图:8位的:24位的:这样虽然在训练
- 如果我们的web应用有大量的异步请求,而这些异步请求是在web服务器认证的情况下,那当我们请求发生在服务器认证失效下,服务器自动302到登录
- 创建随机数 ①自JavaScript产生后,好多浏览器中都有内置的随机数发生方法。例如: var number = Math.random(
- 编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出绝对路径。import osclass Sear
- 列表添加元素append(),extend(),insert(),+list区别回忆初学python的时候,对列表list添加元素时,对类表
- 一、图像色彩通道拆分import cv2img1 = cv2.imread(r"D:\OpencvTest\example.jpg
- 1.无效数据的概念无效数据是指不符合数据收集目的或数据收集标准的数据。这些数据可能来自于不准确的测量、缺失值、错误标注、虚假的数据源或其他问
- 1.如何获取表单<select>域的选择部分的文本? <form name="a"> <s
- 在上一讲中已经连接了数据库。就数据库而言,连接之后就要对其操作。但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作
- 组件<template><div> <input id="upload_file&quo
- 具体方法:1使用panda read_excel 方法加载excel2使用concat将DataFrame列表进行拼接3然后使用pd.Exc
- 背景:9月份有部分数据缺失,这部分数据在邮箱里,需要重新拉取,但是每天几百封邮件,总共有6、7万封邮件,使用stat()和retr(whic
- 弹指间,2023已经到来,新的一年,祝大家新年快乐,阖家幸福呀~~~好吧,进入正题,2023的到来,肯定少不了烟花吧(外面不让放炮,那咱们就
- 今天要说的是一个高速视频流的采集和传输的问题,我不是研究这一块的,没有使用什么算法,仅仅是兴趣导致我很想搞懂这个问题.  
- <div id="msg"></div> <input type="text&q