JavaScript中利用call方法实现继承与参数传递
本文详解JavaScript中call方法的两种核心应用:一是通过重写window.setTimeout实现向回调函数传递额外参数,二是利用call实现类之间的属性与方法继承。文章对比了call与apply在参数传递上的区别,并通过具体代码示例展示了私有变量隔离及多重继承的实现逻辑。
引言与背景
此前收到一个关于JavaScript中重载的示例,虽然对其具体实现原理尚不完全清晰,但鉴于其参考价值,仍将其整理分享。
利用call实现setTimeout参数传递
探讨如何在setTimeout中传递对象参数。
以下代码展示了如何向内部函数传递参数。
<script type="text/javascript">
var _st = window.setTimeout;
window.setTimeout = function(fRef, mDelay) {
if(typeof fRef == 'function'){
var argu = Array.prototype.slice.call(arguments,2);
var f = (function(){ fRef.apply(null, argu); });
return _st(f, mDelay);
}
return _st(fRef,mDelay);
}
function test(x){
alert(x);
}
window.setTimeout(test,1000,'fason');
</script>
call与apply方法的对比
关于JScript参考中call方法的说明:调用一个对象的一个方法,以另一个对象替换当前对象。其语法为call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但官方文档未提供具体示例。
关于JScript参考中apply方法的说明:应用某一对象的一个方法,用另一个对象替换当前对象。其语法为apply([thisObj[,argArray]])。
实际上,这两个方法的作用几乎相同。需要注意的区别在于:call(thisObj[,arg1[, arg2[,)中的参数可以是独立的变量,而apply([thisObj[,argArray]])中的第二个参数必须是一个数组集合。
利用call实现JavaScript继承
今日又看到一篇利用call实现继承的示例,内容较为简单,由浅入深,一并整理如下。
<script language="javascript" type="text/javascript">
function father(){//父类
var self=this; //私有变量,子类里不会继承!
var var_private="private variable"; //私有变量
this.var_public="public variable"; //公有变量
this.author="xling";
this.test=function(msg){ //公有方法
alert("该方法位于父类 :" + msg + "\n" + self.author);
}
var test2=function(){ //私有方法,子类不能调用
alert("这个方法是父类的私有方法");
}
}
function father2(){
this.email="xlingFairy#hotmail.com";
}
function suber(){//子类
father.call(this);//通过这一句来继承父类(father)类的可见变量及方法(this)
}
function sun(){
suber.call(this);
father2.call(this);//和上面的一句放在一起,實現多重繼承!爽啊!
}
var mySuber=new suber();
mySuber.test("参数是从子类的实例里传入的");
//mySuber.test2(); //这一句会发生错误码,因为test2是父类的私有类
alert("父类的私有变量,子类不能读取:" + mySuber.var_private);
alert("父类的公有变量,子类可以读取" + mySuber.var_public);
var mySun=new sun();
mySun.test("这个是从孙子级的实例里传入的参数");
alert("父类的私有变量,子类不能读取:" + mySun.var_private);
alert("父类的公有变量,子类可以读取" + mySun.var_public);
alert(mySun.email);
</script>
JS大数值转字符串出现科学计数法怎么办
2026-11-05 17:09:21
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
