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

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

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

arg1, arg2, , argN 可选项。将被传递方法参数序列。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

-------------------------------------------------------------------------------------------

obj1.method1.call(obj2,argument1,argument2) 
如上,call 的作用就是把 obj1 的方法放到 obj2 上使用,后面的 argument1.. 这些做为参数传入.

举一个具体的例子 
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) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

看一个稍微复杂一点的例子

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() 方法放到 c2 上来执行,所以 this.name 应该是 class2,执行的结果就是 :alert("class2");

怎么样,觉得有意思了吧,可以让 a 对象来执行 b 对象的方法,这是 java 程序员所不敢想的。还有更有趣的,可以用 call 来实现继承

function Class1() 

    this.showTxt = function(txt) 
    { 
        alert(txt); 
    } 
}

function Class2() 

    Class1.call(this); 
}

var c2 = new Class2();

c2.showTxt("cc");

这样 Class2 就继承 Class1 了,Class1.call(this) 的 意思就是使用 Class1 对象代替 this 对象,那么 Class2 中不就有 Class1 的所有属性和方法了吗,c2 对象就能够直接调用 Class1 的方法以及属性了,执行结果就是:alert("cc");

对的,就是这样,这就是 javaScript 如何来模拟面向对象中的继承的,还可以实现多重继承。

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); 
}

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

参考:js call

转载于:https://www.cnblogs.com/xiaochechang/p/5769487.html

JavaScript call()函数的应用相关推荐

  1. javascript 回调函数

    javascript 回调函数 回调函数 作为参数传递的函数 示例代码 let x = function () {console.log("执行回调函数") }let y = fu ...

  2. [译] ES6+ 中的 JavaScript 工厂函数(第八部分)

    本文讲的是[译] ES6+ 中的 JavaScript 工厂函数(第八部分), 原文地址:JavaScript Factory Functions with ES6+ 原文作者:Eric Elliot ...

  3. 【译】JavaScript 工厂函数 vs 构造函数

    译者:前端小智 原文:medium.com/@chamikakas- 当谈到JavaScript语言与其他编程语言相比时,你可能会听到一些令人困惑东西,其中之一是工厂函数和构造函数. 想优质文章请猛戳 ...

  4. 理解javascript 回调函数

    理解javascript 回调函数 原文:理解javascript 回调函数 ##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一 ...

  5. 为什么使用JavaScript eval函数是个坏主意?

    eval函数是一种动态生成代码的强大而简便的方法,那么有哪些警告? #1楼 我知道这个讨论很古老,但是我真的很喜欢Google的这种方法,并希望与他人分享这种感觉:) 另一件事是,您越了解越多,您就会 ...

  6. 细说JavaScript异步函数发展历程

    2019独角兽企业重金招聘Python工程师标准>>> < The Evolution of Asynchronous JavaScript >外文梳理了JavaScri ...

  7. JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域

    一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){var bar = 1;fn(); } var bar = 99; test(funct ...

  8. JavaScript的函数

    JavaScript的函数 总共有三种:普通函数.匿名函数.自执行函数 普通函数:     function func() {          } 匿名函数:    setInternal(执行的函 ...

  9. Javascript变量函数浅谈

    一.变量 在javascript变量中可以存放两种类型的值:原始值和引用值. 原始值存储在栈上的简单字段,也就是值直接存储在变量所标示的位置内. 引用值存储在堆内的对象,栈内变量保存的是指向堆内对象的 ...

  10. JavaScript教程——函数(arguments 对象)

    arguments 对象 定义 由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数.这就是arguments对象的由来. arguments对象包含了 ...

最新文章

  1. java设计模式-代理模式初探
  2. java回调机制及其实现(转)
  3. C#学习Error问题:“System.NullReferenceException:未将对象引用设置到对象的实例”
  4. ack机制之代码实现,实现BaseRichBolt的方式,使用BaseBasicBolt的方式实现BaseRichBolt发ack和fail的功能
  5. 八数码问题II-bfs和map标记
  6. 二分查找递归和非递归方法分析
  7. .net中的硬盘操作(针对Windows )
  8. 一段简单的打印代码(c#)
  9. python入门第二章房贷计算器 打印五子棋棋盘 猜数字 计数器 逢七拍手游戏
  10. [转]使用Visual C#制作可伸缩个性化窗体
  11. mpAndroidchart 坐标和图表距离_几个小细节--图表那些事
  12. 190312每日一句
  13. 码出高效,码出质量:阿里Java开发手册正式发布!
  14. imei模拟修改_自动修改android模拟设备号imei的小程序
  15. JavaScript之继承和原型
  16. 数据库事物,隔离级别慢慢深入
  17. c语言程序如何在keil中运行,keil c51中C程序的启动过程
  18. 高新技术企业认定领域细分有几项
  19. 通过语言包,让云豹短视频源码实现国际化运营
  20. 知乎上40个有趣回复,很精辟

热门文章

  1. 虚拟机游戏获取服务器地址,vue获取服务器地址
  2. python 数据分析库_五个 Python 常用数据分析库
  3. VS2019安全函数scanf_s问题
  4. pata1015_ATA / PATA的完整形式是什么?
  5. 合并文件夹中子目录_01 Linux之统计文件夹中文件个数以及目录个数
  6. linux内核设计与实现---下半部和推后执行的工作
  7. 串口发送通信---UART发送---STM32F4实现
  8. 文字常量区和栈区考点
  9. 《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr
  10. xpath 简单小记