手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >Javascript中call的两种用法实例
Javascript中call的两种用法实例
摘要:用法一(常见用法):表现形式为:一个对象.方法.call(另一个对象),意义是用另一个对象代替当前对象,执行当前对象的方法。先看示例:复制代...

用法一(常见用法):

表现形式为:一个对象.方法.call(另一个对象),意义是用另一个对象代替当前对象,执行当前对象的方法。先看示例:

复制代码 代码如下:

function Class1(){

this.name = "class1";

this.showName = function(){

alert(this.name);

}

}

function Class2(){

this.name = "class2";

}

var c1 = new Class1();

var c2 = new Class2();

c1.showName.call(c2);

c2.showName(); //不能执行

我们先分别定义了两个function,分别是Class1和Class2,它们的主要区别是Class2比Class1多了一个showName()方法。接着定义了与Class1、Class2对应的对象c1和c2,这时候我们清醒的知道,c1有showName()方法而c2没有。但是奇迹出现了,当我们执行 c1.shoName.call(c2) 时,会弹出c2的name值,即"class2"。其实,我们执行的任然是c1的方法,只不过临时起意地把对象c2偷换成对象c1,执行完毕后,它们任然是定义时的样子,c2并没有因此多了些什么方法。为了检测c2有没有多了方法,示例加了行 c2.showNmae(); 它是不能被执行的,浏览器会报出 Object #<Class2> has no method 'showName' 的错误。

为什么要这么做?前面说了,这是一种临时起意的使用方法,我们就是利用其高效的编程而已。但这并不是没有限制的,假设用c1和c2表示被替换的对象和替换对象,用fun1表示c1固有的方法。1、当fun1不需要参数,且不用到父函数中的任意局部变量时,其实c1.fun1.call(c2) 和 c1.fun1() 没什么区别;2、当fun1不需要参数但是用到父函数中的变量,那么就要求生成c1和c2的function有相同名称的那些个被fun1使用的变量;3、当fun1需要参数时,形式要改写成c1.fun1.call(c2, 参数1, 参数2, ...参数n),这个时候生成c1的function中的变量名就不必和生成c2的function的变量名同名了,只需对应即可。其实,我们在用到call的这种用法时,c2和c1往往在结构和功能上已经有很大的相似性了,所以上述三点很容易避免。

用法二:

在function的定义过程中使用,表现形式:另一个已存在函数.call(this),它可以将另一个已存在函数的变量、方法统统克隆到自己的函数中,实现一种类似于继承的功能。看个例子:

复制代码 代码如下:

function Animal(name){

this.name = name;

this.showName = function(){

alert(this.name);

}

};

var animal = new Animal("small_animal");

animal.showName(); //alert("small_animal")

function Cat(name){

Animal.call(this, name);

};

//var Animal = null; //取消注释试一试

var cat = new Cat("black_cat");

cat.showName(); //alert("black_cat")

【Javascript中call的两种用法实例】相关文章:

介绍JavaScript中Math.abs()方法的使用

灵活的理解JavaScript中的this指向

JavaScript正则表达式之multiline属性的应用

在JavaScript中使用NaN值的方法

Javascript监视变量变化的方法

浅谈Javascript线程及定时机制

详谈javascript中的cookie

javascript中this的四种用法

Javascript高级应用:文件操作篇

JavaScript中Math.SQRT2属性的使用详解

精品推荐
分类导航