文章目录
继承主要是用到了 js 中的call 或者 apply 函数
call方法JScript参考中的说明:调用一个对象的一个方法,以另一个对象替换当前对象。call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但是没有示例
apply方法JScript参考中的说明:应用某一对象的一个方法,用另一个对象替换当前对象。apply([thisObj[,argArray]])
实际上这两个的作用几乎是相同的,要注意的地方是call(thisObj[,arg1[, arg2[,)中的arg参数可以是变量,而apply([thisObj[,argArray]])中的参数为数组集合。下面来看看call, apply的具体应用
// simple call demo
function simpleCallDemo(arg) ...{
window.alert(arg);
}
function handleSPC(arg) ...{
simpleCallDemo.call(this, arg);
}
// simple apply demo
function simpleApplyDemo(arg) ...{
window.alert(arg);
}
function handleSPA(arg) ...{
simpleApplyDemo.apply(this, arguments);
}
function simpleCallDemo(arg) ...{
window.alert(arg);
}
function handleSPC(arg) ...{
simpleCallDemo.call(this, arg);
}
// simple apply demo
function simpleApplyDemo(arg) ...{
window.alert(arg);
}
function handleSPA(arg) ...{
simpleApplyDemo.apply(this, arguments);
}
从上面简单的例子可以看出,call和apply可以把当前的参数传递给另外一个函数的参数中,从而调用另一个函数的应用。有的时候这是一个很实用的方法,当然,用call或是apply(是参数或是数组),看实际情况而定了。
继承:
call和apply还有一个技巧在里面,就是用call和apply应用另一个函数(类)以后,当前的函数(类)就具备了另一个函数(类)的方法或者是属性,这也可以称之为“继承”。看下面示例。
function base() ...{
this.member = "never-online";
this.method = function() ...{
window.alert(this.member);
}
}
function extend() ...{
base.call(this);
window.alert(member);
window.alert(this.method);
}
extend();
this.member = "never-online";
this.method = function() ...{
window.alert(this.member);
}
}
function extend() ...{
base.call(this);
window.alert(member);
window.alert(this.method);
}
extend();
上面的例子可以看出,通过call之后,extend可以继承到base的方法和属性。
再看一个apply的应用
//方法1
function oldf(x) ...{
return "没改之前的方法:" + x;
}
//方法2
function newf(args) ...{
args[0] = "修改之后的方法: " + args[0];
return args;
}
//开始将方法2跟方法1连接起来,让调用方法1的时候先调用方法2
function handleAdApplyDemo(obj, fname, newFunc) ...{
var oldFunc = obj[fname];
obj[fname] = function() ...{
return oldFunc.apply(this, newFunc(arguments));
};
}
handleAdApplyDemo(this, "oldf", newf);
//试一下修改之后的方法
alert(oldf("hello"));
function oldf(x) ...{
return "没改之前的方法:" + x;
}
//方法2
function newf(args) ...{
args[0] = "修改之后的方法: " + args[0];
return args;
}
//开始将方法2跟方法1连接起来,让调用方法1的时候先调用方法2
function handleAdApplyDemo(obj, fname, newFunc) ...{
var oldFunc = obj[fname];
obj[fname] = function() ...{
return oldFunc.apply(this, newFunc(arguments));
};
}
handleAdApplyDemo(this, "oldf", newf);
//试一下修改之后的方法
alert(oldf("hello"));
这样便改写了方法1