JS 重写alert,使之能输出多个参数
windows._alert = windows.alert;
windows.alert = function(){
_alert = (Array.prototype.slice(arguments).join(""));
};
alert(,,,,,,,,,,);
1 var a={length:2,0:'first',1:'second'};
2 Array.prototype.slice.call(a);// ["first", "second"]
3
4 var a={length:2};
5 Array.prototype.slice.call(a);// [undefined, undefined]
可能刚开始学习js的童鞋并不是很能理解这句为什么能实现这样的功能。比如我就是一个,所以,来探究一下。
首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组,这里我们看第2个。
1 var a = function(){
2 console.log(this); // 'littledu'
3 console.log(typeof this); // Object
4 console.log(this instanceof String); // true
5 }
6 a.call('littledu');
1 Array.prototype.slice = function(start,end){
2 var result = new Array();
3 start = start || 0;
4 end = end || this.length; //this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键
5 for(var i = start; i < end; i++){
6 result.push(this[i]);
7 }
8 return result;
9 }
大概就是这样吧,理解就行,不深究。
最后,附个转成数组的通用函数
1 var toArray = function(s){
2 try{
3 return Array.prototype.slice.call(s);
4 } catch(e){
5 var arr = [];
6 for(var i = 0,len = s.length; i < len; i++){
7 //arr.push(s[i]);
arr[i] = s[i]; //据说这样比push快
8 }
9 return arr;
10 }
11 }
写字前面
在js中我们经常会看到Array.prototype.slice.call(arguments,0)的写法,当然,这个方法的作用也许大家都明白,那就是把类数组对象转换成一个真正的数组。关于这个方法,我说说自己的理解。
这里涉及到slice()方法和call()方法,所以先简单说说这两个方法。
slice()方法
数组和字符串都有这个slice方法,这个方法的作用是截取一段数据。它接收两个参数,第一个参数是要截取的位置索引,第二参数可选,表示要截取到的结束位置,但是不包括结束位置。在数组中,该方法的返回值是包含截取元素的组成的数组,在字符串中,该方法的返回值是包含截取字符串组成的字符串。
该方法也可以传入负数值,当参数为负数的时候,将参数和数组或字符串的长度相加得到的正数作为实际的参数。
如下:
[1,2,3,4,5,6].slice(2,4);
[1,2,3,4,5,6].slice(-4,-2);
返回值均为[3,4],为数组。
'everything'.slice(2,4);
'everything'.slice(-4,-2);
返回值分别为'er'和'hi',为字符串。
如果之传入一个参数的话,那就是输出从开始位置到结束位置的所有元素。不再举例。
字符串的其他类似方法
在字符串中,和slice()方法类型的还有两个方法:
substring()和substr()方法。
其中,substring()方法表示返回从开始位置到结束位置的字符串,substr()接收两个参数,第一个参数表示开始位置,第二个参数表示要截取的字符个数,和前两个方法略有不同。
当传入方法的参数为负数时,这三种方法又略有不同。
当传入方法的参数为负数时:
slice()像上面说的,是负数加上字符串的长度得出相应的正值;
substring()方法的参数均置为零;
substr()方法的第一个参数为负值加上字符串长度得到的正值,第二个参数置为零。
call()和apply()方法
call()和apply()方法主要是用来扩充函数的作用域。
call()和apply()方法接收两个参数:
apply():第一个参数是作用域,第二个是参数数组,其中第二个参数可以是数组实例,也可以是arguments对象。
call()方法也接收两个参数,仅仅在于和apply()的传参方式不同:传递函数的参数必须逐个写入。
鉴于这里不是重点,在这里就不再赘述。
Array.prototype.slice.call(arguments,0)
在Array.prototype.slice.call(arguments,0)中,Array.prototype.slice调用的是Array的原型方法,对于正真的数组是有slice()方法,但是对于像arguments或者自己定义的一些类数组对象虽然存在length等若干属性,但是并没有slice()方法,所以对于这种类数组对象就得使用原型方法来使用slice()方法,即Array.prototype.slice(如果在自定义中的类数组对象中自定义了slice()方法,那么自然可以直接调用)。
所以,Array.prototype.slice.call(arguments,0)的意思就可以这样理解:对于arguments类数组,我们调用Array.prototype.slice原型方法,并用call()方法,将作用域限定在arguments中,这里Array.prototype就可以理解为arguments,同参数0为slice()方法的第一个参数,即开始位置索引。通过这种方法就将arguments类数组转换成了真数组。
当然,把arguments转换为数组也可以用遍历,那样代码自然就会多一些,而且不够直接。
小结
以上只是一家之言,欢迎交流探讨。
JS 重写alert,使之能输出多个参数的更多相关文章
- JS重写alert,保证弹窗错误的友好性
// ------------------------------------------------------------- // 重写alert,保证弹窗错误的友好性 var j_oldAler ...
- js重写alert()弹窗
//重写alertwindow.alert = function(str){ var alertFram = document.getElementById('alertFram'); var shi ...
- js 重写alert 兼容iphone使得alert 不带src
<script> window.alert = function(name){ var iframe = document.createElement("IFRAME" ...
- 修改js confirm alert 提示框文字的简单实例
修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...
- js的alert和confirm美化
--前言-- window对象的alert和confirm标准方法在不同浏览器的显示效果不太相同,有个相同点是都不是很美观.我们的想法是使用js和css分别仿照它们,提供另一套函数,使在不同浏览器的有 ...
- [Winform]Cefsharp重写alert与confirm弹窗
摘要 在使用winform内嵌cefsharp浏览本地页面的时候,如果出现alert弹窗,会在标题栏显示页面所在目录.所以想起来重写alert的样式,通过winform的MessageBox进行提示. ...
- 在Android的webview中定做js的alert,confirm和prompt对话框的方法
在Android的webview中定制js的alert,confirm和prompt对话框的方法 http://618119.com/archives/2010/12/20/199.html 1.首先 ...
- (网页)JS实现alert中显示换行的方法
转自脚本之家: 这篇文章主要介绍了JS实现alert中显示换行的方法,实例分析了两种实现alert换行的实现技巧,非常简单实用,需要的朋友可以参考下 本文实例讲述了JS实现alert中显示换行的方法. ...
- 重写alert方法,去掉地址显示
//重写alert方法,去掉地址显示window.alert = function(name){ var iframe = document.createElement("IFRAME&qu ...
随机推荐
- 【cocos2d-x 3.0-Mac配置篇】
就在昨天触控正式发布了3.0正式版本... 在这个喜大普奔的日子里,我们又开始了新一轮的革命,先不说其他的,再来看看3.0目录文件里面有什么? 首先是精简了很多,无论是从目录结构,和所用到的工具类,都 ...
- Hessian——轻量级远程调用方案
Hessian是caucho公司开发的一种基于二进制RPC协议(Remote Procedure Call protocol)的轻量级远程调用框架.具有多种语言的实现,但用的最多的当然是Java实现 ...
- Day37 多进程
什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体: ...
- OI字符串 简单学习笔记
持续更新qwq KMP 其实是MP啦qwq 就是先自己匹配自己得到状态图,然后再在上面进行模式串的匹配. nxt数组返回的是以该节点结尾的,最长的,在前面出现过的,不相交的,字符串的最靠右的,末位位置 ...
- Pacemaker 介绍
1. 简介 Pacemaker是一个集群资源管理者.他用资源级别的监测和恢复来保证集群服务(aka.资源)的最大可用性.它可以用你所擅长的基础组件(Corosync或者是Heartbeat)来实现通信 ...
- FunDA(11)- 数据库操作的并行运算:Parallel data processing
FunDA最重要的设计目标之一就是能够实现数据库操作的并行运算.我们先重温一下fs2是如何实现并行运算的.我们用interleave.merge.either这几种方式来同时处理两个Stream里的元 ...
- 直接访问实例变量 VS 通过点语法访问实例变量
直接访问实例变量,不会经过 OC 的方法派发机制,速度比较块.会直接访问对象的实例变量对应的内存. 直接访问实例变量,不会调用"设置方法".绕过了相关属性对应的"内存管理 ...
- 常见手机的useragent
设备 系统 浏览器 User-Agent 华为Mate 10 Pro Android QQ浏览器 Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BLA-AL ...
- error: failed to push some refs to 'https://github.com/username/python.git'
解决error: failed to push some refs to 'https://github.com/bluepen/python.git' 当我们在使用git工具上传我们自己的代码时,可 ...
- sass安装及使用
在Mac系统下,Ruby一般已内置在其中,如果您不能确认是否已安装,或者说你不知道你的Ruby使用的版本,你可以打开你的命令工具: $ ruby -v 安装sass 在大多数情况和大部分人群中,还是喜 ...