JavaScript核心工具函数与原型方法实战指南

作者:半夏时间:2026-10-25 18:50:56浏览:460

本文整理JavaScript常用开发技巧,涵盖Cookie读写工具类实现、对象属性调试函数、正则表达式元字符详解及常用方法示例。重点解析call与apply函数的原理,通过函数替换、多重继承模拟及数组操作优化等实例,展示如何改变执行上下文及高效处理参数数组。

具体实现细节请参考附件中的示例代码,整体逻辑设计较为简洁直观。




1. 关于 cookie 的函数:

Cookie操作工具实现

相关代码实现如下:

 
/** 
实现一个用于处理Cookie的工具类。
使用方式示例:保存Cookie时调用 CookieTool('name', '1', {expires: 7}),表示创建一个键名为name、值为1且7天后过期的Cookie。
读取Cookie时调用 CookieTool('name'),将返回对应的值1。
参数说明:name
参数说明:value
参数说明:options
返回值说明
*/ 
CookieTool = function(name, value, options) {
if (typeof value != 'undefined') {
options = options || {};
if (value === null) {
value = '';
options.expires = -1;
} 
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
} 
expires = '; expires=' + date.toUTCString();
} 
var path = options.path ? '; path=' + (options.path) : '';
var domain = options.domain ? '; domain=' + (options.domain) : '';
var secure = options.secure ? '; secure' : '';
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
} 
} 
} 
return cookieValue;
} 
}; 

2. 关于一个可以查看 js 对象的 js 函数,很酷的方法:

JavaScript对象调试函数

相关代码实现如下:

 
/** 
用于检查并输出对象属性的辅助函数。
*/ 
function debugObjectInfo(obj){
traceObject(obj);
function traceObject(obj){
var str = '';
if(obj.tagName&&obj.name&&obj.id)
str="<table border='1' width='100%'><tr><td colspan='2' bgcolor='#ffff99'>traceObject tag: &lt;"+obj.tagName+"&gt; name = \""+obj.name+"\" id = \""+obj.id+"\" </td></tr>";
else{
str="<table border='1' width='100%'>";
} 
var key=[];
for(var i in obj){
key.push(i);
} 
key.sort();
for(var i=0;i<key.length;i++){
var v= new String(obj[key[i]]).replace(/</g,"&lt;").replace(/>/g,"&gt;");
str+="<tr><td valign='top'>"+key[i]+"</td><td>"+v+"</td></tr>";
} 
str=str+"</table>";
writeMsg(str);
} 
function trace(v){
var str="<table border='1' width='100%'><tr><td bgcolor='#ffff99'>";
str+=String(v).replace(/</g,"&lt;").replace(/>/g,"&gt;");
str+="</td></tr></table>";
writeMsg(str);
} 
function writeMsg(s){
traceWin=window.open("","traceWindow","height=600, width=800,scrollbars=yes");
traceWin.document.write(s);
} 
} 

3. 正则表达式:

正则表达式元字符与常用方法

g 代表全局匹配


m 代表可以进行多行匹配


i 代表不区分大小写匹配


^ 匹配输入字符串的开始位置


$ 匹配输入字符串的结束位置


* 匹配前面的子表达式零次或多次. 等价于{0,}


+ 匹配前面的子表达式一次或多次. 等价于{1,}


? 匹配前面的子表达式零次或一次. 等价于[0,1} , 当该字符跟在任何一个其他限制符(*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。



\d 匹配一个数字字符. 等价于 [0-9]


\D 匹配一个非数字符. 等价于 [^0-9]


\w ,等价于 "[A-Za-z0-9_]"


\W 匹配任何非单词字符,等价于 "[^A-Za-z0-9]"


\s 匹配任何空白字符, 包括空格 制表符 换页符 等等. 等价于[\f\n\r\t\v]


\S 匹配任何非空白字符. 等价于 [^\f\r\n\t\v]


\b 匹配一个单词边界,也就是指单词和空格间的位置。


\B 匹配非单词边界。



正则表达式在JavaScript中的常用操作方法:


相关代码实现如下:

 
/** 
在源字符串中查找满足正则表达式要求的子串。
返回值说明
*/ 
function MatchDemo() {
var r, re; // 声明变量。
var s = "The rain in Spain falls mainly in the plain";
re = new RegExp("ain", "g"); // 创建正则表达式对象。
r = s.match(re); // 在字符串 s 中查找匹配。
return (r);
} 
/** 
返回源字符串中符合正则表达式的所有子串及其位置信息。
*/ 
function RegExpTest() {
var ver = Number(ScriptEngineMajorVersion() + "."
+ ScriptEngineMinorVersion())
var ans = '';
if (ver >= 5.5) { // 测试 JScript 的版本。
var src = "The rain in Spain falls mainly in the plain.";
var re = /\w+/g; // 创建正则表达式模式。
var arr;
while ((arr = re.exec(src)) != null)
ans += arr.index + "-" + arr.lastIndex + arr + "\t";
} else {
ans = "请使用 JScript 的更新版本";
} 
return ans;
} 
/** 
对源字符串进行正则表达式匹配检查,判断其是否符合指定模式。
*/ 
function TestDemo() {
var s1;
var source = "abcdefg";
var regex = /\w+/g; // 创建正则表达式模式。
if (regex.test(source))
s1 = " contains ";
else
s1 = " does not contain ";
return ("'" + source + "'" + s1 + "'" + regex.source + "'");
} 
/** 
在源字符串中查找正则表达式匹配的子串位置。
返回值说明
*/ 
function SearchDemo() {
var r, re;
var s = "The rain in Spain falls mainly in the plain.";
re = /falls/i;
r = s.search(re);
return (r);
} 

4. 很值得学习并要使用好的方法,call():

call方法原理与应用

call([thisObj[,arg1[, arg2[, [,.argN]]]]])


参数说明


thisObj


可选项。将被用作当前对象的对象。


arg1, arg2, , argN


可选项。将被传递方法参数序列。


说明


call 方法可用于替代另一个对象调用指定方法。它能够将函数的执行上下文从初始环境切换为由 thisObj 指定的新对象。



基础应用示例:


相关代码实现如下:

 
function add(a,b)
{ 
alert(a+b);
} 
function sub(a,b)
{ 
alert(a-b);
} 
add.call(sub,3,1);
//此示例意为使用 add 函数替换 sub 函数的执行。add.call(sub,3,1) 等效于 add(3,1),因此运行结果为弹出提示框显示 4。

进阶应用示例:


相关代码实现如下:

 
function Class1()
{ 
this.name = "class1";
this.showNam = function()
{ 
alert(this.name);
} 
} 
function Class2()
{ 
this.name = "class2";
} 
var c1 = new Class1();
var c2 = new Class2();
c1.showNam.call(c2);
//call 的作用是将 c1 的方法借用至 c2 上执行。尽管 c2 原本没有 showNam() 方法,但通过调用 c1 的 showNam() 方法,此时 this.name 指向 class2,因此执行结果为弹出提示框显示 "class2"。

模拟多重继承的示例:


相关代码实现如下:

 
function Class10()
{ 
this.showSub = function(a,b)
{ 
alert(a-b);
} 
} 
function Class11()
{ 
this.showAdd = function(a,b)
{ 
alert(a+b);
} 
} 
function Class2()
{ 
Class10.call(this);
Class11.call(this);
} 

5. apply 函数:

apply方法原理与数组优化

Function.apply(obj,args) 方法接收两个参数。


obj:该对象将替代 Function 类内部原本的 this 对象。


args:这是一个数组,它将作为参数列表传递给 Function(对应 args 到 arguments 的映射)。


实现类似 call 的继承效果:


相关代码实现如下:

 
function Person(name,age){ //定义一个类,人类
this.name=name; //名字
this.age=age; //年龄
this.sayhello=function(){alert("hello")};
} 
function Print(){ //显示类的属性
this.funcName="Print";
this.show=function(){
var msg=[];
for(var key in this){
if(typeof(this[key])!="function"){
msg.push([key,":",this[key]].join(""));
} 
} 
alert(msg.join(" "));
}; 
} 
function Student(name,age,grade,school){ //学生类
Person.apply(this,arguments);
Print.apply(this,arguments);
this.grade=grade; //年级
this.school=school; //学校
} 
var p1=new Person("jake",10);
p1.sayhello();
var s1=new Student("tom",13,6,"清华小学");
s1.show();
s1.sayhello();
alert(s1.funcName);

利用 apply 处理数组参数进行函数优化的技巧,非常实用:


相关代码实现如下:

 
Math.max 函数后可接任意数量的参数,最终返回所有参数中的最大值。
例如
alert(Math.max(5,8)) //返回 8
alert(Math.max(5,7,9,3,1,6)) //返回 9
但在许多场景下,我们需要找出数组中的最大元素。
var arr=[5,7,9,1]
alert(Math.max(arr)) // 这样直接传入数组是无效的。必须采用以下方式
function getMax(arr){
var arrLen=arr.length;
for(var i=0,ret=arr[0];i<arrLen;i++){
ret=Math.max(ret,arr[i]);
} 
return ret;
} 
使用 apply 的实现方式如下:
function getMax2(arr){
return Math.max.apply(null,arr);
} 

下面是另一个示例,用于合并两个数组:


相关代码实现如下:

 
再比如数组的 push 方法。
var arr1=[1,3,4];
var arr2=[3,4,5];
若要将 arr2 展开并逐个追加到 arr1 中,最终使 arr1=[1,3,4,3,4,5]
直接调用 arr1.push(arr2) 是无法实现的。因为这样做会得到 [1,3,4,[3,4,5]]
我们通常只能使用循环逐个 push(当然也可以使用 arr1.concat(arr2),但 concat 方法不会改变 arr1 本身)
var arrLen=arr2.length
for(var i=0;i<arrLen;i++){
arr1.push(arr2[i]);
} 

使用 apply 的实现方式:


相关代码实现如下:

 
Array.prototype.push.apply(arr1,arr2)

打包下载链接 http://xiazai.jb51.net/201101/yuanma/MyHtml.rar

作者最新文章