关闭

call()的用法

标签: jscall
2440人阅读 评论(0) 收藏 举报
分类:

转自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call

call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法.

注意:该方法的作用和 apply() 方法类似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组

语法

fun.call(thisArg[, arg1[, arg2[, ...]]])

参数

thisArg
fun函数运行时指定的this需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为nullundefinedthis值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。
arg1, arg2, ...
指定的参数列表。

描述

当调用一个函数时,可以赋值一个不同的 this 对象。this 引用当前对象,即 call 方法的第一个参数。

通过 call 方法,你可以在一个对象上借用另一个对象上的方法,比如Object.prototype.toString.call([]),就是一个Array对象借用了Object对象上的方法。

示例

使用call方法调用父构造函数

在一个子构造函数中,你可以通过调用父构造函数的 call 方法来实现继承类似于Java中的写法。下例中,使用 Food 和 Toy 构造函数创建的对象实例都会拥有在 Product 构造函数中添加的 name 属性和 price 属性,但 category 属性是在各自的构造函数中定义的。

function Product(name, price) {
  this.name = name;
  this.price = price;

  if (price < 0) {
    throw RangeError('Cannot create product ' +
                      this.name + ' with a negative price');
  }

  return this;
}

function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}

Food.prototype = Object.create(Product.prototype);
Food.prototype.constructor = Food; // Reset the constructor from Product to Food

function Toy(name, price) {
  Product.call(this, name, price);
  this.category = 'toy';
}

Toy.prototype = Object.create(Product.prototype);
Toy.prototype.constructor = Toy; // Reset the constructor from Product to Toy

var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);

使用call方法调用匿名函数

在下例中的for循环体内,我们创建了一个匿名函数,然后通过调用该函数的call方法,将每个数组元素作为指定的this值执行了那个匿名函数。这个匿名函数的主要目的是给每个数组元素对象添加一个print方法,这个print方法可以打印出各元素在数组中的正确索引号。当然,这里不是必须得让数组元素作为this值传入那个匿名函数(普通参数就可以),目的是为了演示call的用法。

var animals = [
  {species: 'Lion', name: 'King'},
  {species: 'Whale', name: 'Fail'}
];

for (var i = 0; i < animals.length; i++) {
  (function (i) { 
    this.print = function () { 
      console.log('#' + i  + ' ' + this.species + ': ' + this.name); 
    } 
    this.print();
  }).call(animals[i], i);
}

使用call方法调用函数并且指定上下文的'this'

在下面的例子中,当调用 greet 方法的时候,该方法的 this 值会绑定到 对象。
 

function greet() {
  var reply = [this.person, 'Is An Awesome', this.role].join(' ');
  console.log(reply);
}

var i = {
  person: 'Douglas Crockford', role: 'Javascript Developer'
};

greet.call(i); // Douglas Crockford Is An Awesome Javascript Developer

补充于:2016.10.14


1、方法定义

call方法: 
语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
定义:调用一个对象的一个方法,以另一个对象替换当前对象。 
说明: 
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

apply方法: 

语法:apply([thisObj[,argArray]]) 
定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
说明: 
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

 

2、常用实例

a、

Java代码  收藏代码
  1. function add(a,b)  
  2. {  
  3.     alert(a+b);  
  4. }  
  5. function sub(a,b)  
  6. {  
  7.     alert(a-b);  
  8. }  
  9.   
  10. add.call(sub,3,1);   

 这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

 

b、

Java代码  收藏代码
  1. function Animal(){    
  2.     this.name = "Animal";    
  3.     this.showName = function(){    
  4.         alert(this.name);    
  5.     }    
  6. }    
  7.   
  8. function Cat(){    
  9.     this.name = "Cat";    
  10. }    
  11.    
  12. var animal = new Animal();    
  13. var cat = new Cat();    
  14.     
  15. //通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。    
  16. //输入结果为"Cat"    
  17. animal.showName.call(cat,",");    
  18. //animal.showName.apply(cat,[]);  

 call 的意思是把 animal 的方法放到cat上执行,原来cat是没有showName() 方法,现在是把animal 的showName()方法放到 cat上来执行,所以this.name 应该是 Cat

 

c、实现继承

Java代码  收藏代码
  1. function Animal(name){      
  2.     this.name = name;      
  3.     this.showName = function(){      
  4.         alert(this.name);      
  5.     }      
  6. }      
  7.     
  8. function Cat(name){    
  9.     Animal.call(this, name);    
  10. }      
  11.     
  12. var cat = new Cat("Black Cat");     
  13. cat.showName();  

 Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了吗,Cat对象就能够直接调用Animal的方法以及属性了.

 

d、多重继承

Java代码  收藏代码
  1. function Class10()  
  2. {  
  3.     this.showSub = function(a,b)  
  4.     {  
  5.         alert(a-b);  
  6.     }  
  7. }  
  8.   
  9. function Class11()  
  10. {  
  11.     this.showAdd = function(a,b)  
  12.     {  
  13.         alert(a+b);  
  14.     }  
  15. }  
  16.   
  17. function Class2()  
  18. {  
  19.     Class10.call(this);  
  20.     Class11.call(this);  
  21. }  

 很简单,使用两个 call 就实现多重继承了
当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call 的用法。说了call ,当然还有 apply,这两个方法基本上是一个意思,区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments
还有 callee,caller..

 

例子来源:http://xiaofeizm55333.iteye.com/blog/80913

http://www.iteye.com/topic/599108  


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

JS的call方法的作用解释,简单易懂

先看看关于call()的官方解释,“调用一个对象的一个方法,以另一个对象替换当前对象。”,看了这样的解释,或许让你更摸不着头脑了。看例子: var x = "我是全局变量";    //定义...
  • ywl570717586
  • ywl570717586
  • 2016-09-27 15:49
  • 4638

汇编入门学习笔记 (九)—— call和ret

疯狂的暑假学习之 汇编入门学习笔记 (九)—— call和ret 参考: 《汇编语言》 王爽 第10章 call和ret都是转移指令。 1. ret和retf ret指令:用栈中的数据,修...
  • billvsme
  • billvsme
  • 2014-07-15 14:31
  • 3046

JavaScript中bind、call、apply函数用法详解

在给我们项目组的其他程序介绍 js 的时候,我准备了很多的内容,但看起来效果不大,果然光讲还是不行的,必须动手。前几天有人问我关于代码里 call() 函数的用法,我让他去看书,这里推荐用js 写服务...
  • chenleixing
  • chenleixing
  • 2015-03-14 14:14
  • 5994

javascript中call()和apply()的用法及区别详解

想必大家也都了解些植物养殖方面的知识吧。那“嫁接”是如何做的呢?“嫁接”又有什么好处可言呢?那就先来了解一下“嫁接”一词? 嫁接,即:一种植物的枝或芽,嫁接到另一种植物的茎或根上,使接在一起的两个...
  • gxfdgz_szj
  • gxfdgz_szj
  • 2015-03-22 11:50
  • 464

JS中的call()方法和apply()方法用法总结

转载链接:http://blog.csdn.net/ganyingxie123456/article/details/70855586 1. 每个函数都包含两个非继承而来的方法:call()方法...
  • hhx_xiaopeng
  • hhx_xiaopeng
  • 2017-11-21 21:09
  • 50

Python可调用对象__call__方法的用法分析

前言 最近有许多朋友私信问我,Python的可调用对象到底有什么用处,为什么要费事的重载括号而不是直接绑定类的普通方法。下面就来为大家分享__call__可调用对象的一些感悟。 精简代码,方便接口...
  • networm3
  • networm3
  • 2013-03-07 10:53
  • 7202

JavaScript学习笔记apply、call、bind用法说明

JavaScript关键字apply、call、bind用法说明以及示例。
  • u011872945
  • u011872945
  • 2017-05-26 18:11
  • 702

[乐意黎原创] 关于JavaScript中apply与call的用法意义及区别

先来看看JS手册中对call的解释: call 方法 调用一个对象的一个方法,以另一个对象替换当前对象。 call([thisObj[,arg1[, arg2[,   [,.argN]]]]])...
  • aerchi
  • aerchi
  • 2014-05-07 18:51
  • 1928

js call跟apply用法全解

ps:  将前面博文中的东西单独提取出来,废话不说直接复制。1. 每个函数都包含两个非继承而来的方法: call( this,arg1,arg2 ) 、apply(this,[arg1,arg2]) ...
  • baidu_33033415
  • baidu_33033415
  • 2017-03-17 10:22
  • 172

js中继承的几种用法总结(apply,call,prototype)

转:http://www.jb51.net/article/44875.htm 一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 复制代...
  • Lostyears
  • Lostyears
  • 2016-03-14 17:48
  • 781
    个人资料
    • 访问:171052次
    • 积分:2582
    • 等级:
    • 排名:第16313名
    • 原创:69篇
    • 转载:151篇
    • 译文:0篇
    • 评论:6条
    最新评论