`
q272156430
  • 浏览: 275782 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

javaScript 中函数对象 call 方法的使用

阅读更多

javaScript 中的call() 是一个奇妙的方法,但也是一个让人迷惑的方法,先看一下官方的解释:

  call方法

  请参阅

  应用于:Function 对象

  要求

  版本 5.5

  调用一个对象的一个方法,以另一个对象替换当前对象。

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

  参数

  thisObj

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

  arg1, arg2, , argN

  可选项。将被传递方法参数序列。

  说明

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

  如果没有提供 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的第二个参数必须是数组,也可以是arguments

  还有 callee,caller,这个和call的 用法就不同了

分享到:
评论

相关推荐

    JavaScript中函数对象调用模式总结

    JavaScript中的函数对象调用模式是编程中至关重要的概念,它涉及到函数作为一等公民、作用域、闭包、原型链等多个核心知识点。这篇博客通过深入分析JavaScript中的函数调用模式,帮助开发者更好地理解和掌握这些概念...

    javascript 各种函数用法

    JavaScript 中的 call 函数提供了多种方法来调用函数,包括: * `call()`: 调用函数并将其上下文设置为指定对象。 * `apply()`: 调用函数并将其上下文设置为指定对象。 * `bind()`: 返回一个绑定了指定对象的函数。...

    【JavaScript源代码】JavaScript函数之call、apply以及bind方法案例详解.docx

    - 当需要在不同上下文中复用同一个函数时,如事件处理或对象方法的封装。 - 使用数组或不定数量参数时,`apply()`特别有用。 - 当需要确保`this`值不会因函数被引用或作为回调而改变时,可以使用`bind()`。 在面向...

    理解JavaScript中函数的使用

    这种方式虽然可以创建函数,但由于其安全性较低,不建议在实际项目中使用。 #### 特殊用法 JavaScript还支持一些特殊的函数使用方式,例如立即执行函数表达式(IIFE): ```javascript (function(a, b) { return...

    javascript调用delphi中的函数

    标题“javascript调用delphi中的函数”涉及到的技术领域是跨语言通信,具体是JavaScript与Delphi之间的交互。这种交互通常发生在Web应用程序与桌面应用程序的集成,或者在浏览器扩展和本地资源之间。以下是对这一...

    JavaScript中this关键字使用方法详解

    如果函数是作为对象的方法调用,`this`将指向调用该方法的对象。例如: ```javascript let obj = { name: 'John', sayName: function() { console.log(this.name); } }; obj.sayName(); // 输出 "John" ``...

    Javascript类的继承,使用this.callParent调用超类方法

    在JavaScript中,面向对象编程是通过构造函数、原型和实例来实现的。当我们谈论类的继承时,我们指的是一个类(子类)可以获取另一个类(父类或超类)的属性和方法,从而实现代码复用和扩展。在本话题中,我们将深入...

    JavaScript核心对象参考手册

    1. **全局对象Global**: JavaScript中的全局对象提供了许多内置函数,如`Math`(数学运算)、`Date`(日期和时间操作)、`JSON`(JSON解析和序列化)等。全局变量默认会成为全局对象的属性。 2. **对象创建与原型...

    Javascript 面向对象的JavaScript进阶

    在JavaScript中,可以通过构造函数或类来创建对象,并通过定义方法来隐藏具体的实现细节。此外,ES6引入了类的概念,进一步增强了抽象的能力。 **示例代码:** ```javascript class USBDevice { constructor(name)...

    JavaScript函数Call、Apply原理实例解析

    这篇文章主要介绍了JavaScript函数Call、Apply原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一、方法重用 使用 call() 方法,您可以编写能够在...

    JavaScript中的apply和call函数详解_.docx

    `apply`和`call`在某些场景下可以帮助我们解决因`this`指向不明确而引发的问题,比如在事件处理函数、对象方法、构造函数等场合。同时,它们也是实现函数柯里化(Currying)和模拟类继承等高级功能的基础。 安全...

    从JQuery源码分析JavaScript函数的apply方法与call方法

    JQuery源码分析与JavaScript中的apply与call方法是JavaScript编程中非常重要的概念,这两者都是函数对象的方法,用于在特定的作用域中执行函数,并可以指定函数体内this的指向。从JQuery源码中分析apply和call方法,...

    javascript对象和函数[文].pdf

    JavaScript中的对象是关键元素,几乎无处不在,甚至函数本身也被视为对象。对象可以理解为可变的键控集合或无序的属性集合,包含简单数据类型、其他对象以及函数(作为方法)。然而,JavaScript中存在一些基本数据...

    深入学习JavaScript中的函数

    - **对象方法**:当函数作为某个对象的方法被调用时,`this`将指向该对象。 - **构造函数**:当函数作为构造函数使用时,`this`指向新创建的对象。 - **箭头函数**:箭头函数没有自己的`this`,它会从外部作用域继承...

    JavaScript对象模型

    在JavaScript中,函数同样是一种对象,具有特殊的内部属性`[[Class]]`,其值为`"Function"`,表明它是函数类型。函数可以作为普通的对象使用,也可以作为构造函数来创建新的对象实例。在实现上,函数拥有特定的内部...

    教案JAVASCRIPT对象与函数.pdf

    JavaScript中的函数有多种调用方式,包括普通调用、apply和call方法,可以改变函数的执行上下文。 在JavaScript String对象中,提供了众多用于处理字符串的方法。查找类函数如charAt()返回指定位置的字符,...

    javascript的函数 入门详解

    - JavaScript中的函数是对象,因此它们具有对象的属性和方法。例如,可以像普通对象那样为函数添加属性,如`test.name = 'zhangsan';`。 - 函数对象的`name`属性可以获取或设置函数的名称。在上面的例子中,`test....

    浅谈javascript中的call、apply、bind_.docx

    其实,ES5 引入 bind 的真正目的是为了弥补 call/apply 的不足,由于 call/apply 会对目标函数自动执行,从而导致它无法在大事绑定函数中使用,而 bind 在实现转变函数 this 的同时又不会执行对应的函数。...

    【JavaScript源代码】Javascript中函数分类&this指向的实例详解.docx

    根据不同的使用场景和定义方式,JavaScript中的函数大致可以分为以下几类: 1. **标准函数声明(Method 1)**: ```javascript function fn() { console.log('fn created '); } ``` 这是最常见的函数定义方式...

    callJavaScript

    另一种方法是使用Node.js的NAN(非阻塞API)库,它使得C++扩展编写变得简单,允许在Node.js环境中调用C++函数,反之亦然。 描述中提到的“头文件、lib及dll”可能指的是为了实现这种交互而需要的库文件。头文件通常...

Global site tag (gtag.js) - Google Analytics