- 浏览: 47196 次
- 性别:
- 来自: 北京
文章分类
最新评论
阅读前需要理解的:
JS中 没有new 的对象在对象里的this是不存在的
例如:
function a(){
this.b="hi";
this.c=function(){alert('hi');}
}
alert(a.b);//out undefined
try{
a.c();
}catch(e){
alert(e->getmessage());//有输出
}
var a =new a();
alert(a.b);//输出 hi
a.c();//输出 hi
1、call
call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
简单的列子(函数调用):
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);
复杂点的例子(方法调用):
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");
实现继承
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 的用法
重载:
function a(){ this.f=function(){ alert("af"); }; this.c=function(){ alert("ac"); } } function b(){ a.call(this); var bf=this.f; this.f=function(){ bf();//调用父类方法 alert("bf") }; } var ob=new b(); ob.f();//输出af,bf ob.c();//输出ac
说了call ,当然还有 apply,这两个方法基本上是一个意思
区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组。当参数明确时可用call, 当参数不明确时可用apply给合arguments
2、apply
对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])
技巧(代码优雅而其执行效率高)
复制代码 代码如下:
alert(Math.max(5,8)) //8
alert(Math.max(5,7,9,3,1,6)) //9
var arr=[5,7,9,1]
alert(Math.max.apply(null,arr));
注意:call apply 是对类而言,也就是方法体而言,或对对象里的方法体而言,单纯对象本身没有这两个函数,如下例:
function a(){ this.f=function(){alert("af");} } function b(){ } var oa=new a(); var ob=new b(); oa.call(ob);//错误的~~ a.call(ob);ob.f();//正确 oa.f.call(ob);//正确
3.arguments
arguments是一个类似数组但不是数组的对象,说它类似(仅仅是类似)数组是因为其具有数组一样的访问性质及方式,可以由 arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表(用funcName.length取),而且不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。
function ArgTest(a, b){ var i, s = "The ArgTest function expected "; var numargs = arguments.length; // 获取被传递参数的数值。 var expargs = ArgTest.length; // 获取期望参数的数值。 if (expargs < 2) s += expargs + " argument. "; else s += expargs + " arguments. "; if (numargs < 2) s += numargs + " was passed."; else s += numargs + " were passed."; s += "\n\n" for (i =0 ; i < numargs; i++){ // 获取参数内容。 s += " Arg " + i + " = " + arguments[i] + "\n"; } return(s); // 返回参数列表。 } window.onload=function() { alert(ArgTest(1,2,3)); }
输出:The ArgTest function expected 2 arguments. 3 were passed.
Arg 0 =1
Arg 1 =2
Arg 2 =3
详细出处参考:http://www.jb51.net/article/25080.htm
:http://www.cnblogs.com/liushannet/archive/2010/10/28/1863999.html
发表评论
-
es6
2016-07-25 17:11 01.export default 不用关系模块输出了什么 ... -
immutable
2016-07-21 17:23 0作者:张克军链接:ht ... -
react
2016-07-08 16:02 0中文文档:http://reactjs.cn/react/ ... -
redux
2016-07-07 15:30 0redux例子counter总结: action:描述发 ... -
angular遇到的问题
2016-03-17 18:53 0Form Validation and fields add ... -
http2
2015-12-22 13:10 0http2资料: http://http2-explai ... -
iconfont的蜕化操作
2015-11-09 16:27 0转自:http://www.cnblogs. ... -
flux
2015-10-19 14:03 0转自:http://www.csdn.net/articl ... -
setTransform
2015-10-15 17:30 0转自:http://book.51cto.co ... -
遇到的问题
2014-12-19 14:37 0http://stackoverflow.com/questi ... -
node安装(windows)
2014-09-14 10:43 0Windows平台下的node.js安装 直接去node ... -
jQuery.Callbacks之demo
2014-08-30 10:56 0jQuery.Callbacks是jquery在1.7版本 ... -
使用proxy改变js上下文
2014-03-27 21:48 0<body> <div id=& ... -
num
2014-01-14 17:31 0$("input[type=text][imemo ... -
js插件模板
2014-01-05 12:36 0(function(){ function Guid ... -
jquery中的this
2013-06-26 21:42 0jQuery.fn.test2= function() ... -
SeaJS与RequireJS最大的区别
2013-06-21 08:43 0SeaJS与RequireJS最大的区别 转自:h ... -
快速排序
2013-06-16 17:35 0快速排序: 设要排序的数组是A[0]……A[N-1],首先 ... -
autocomplete/suggest
2013-06-07 15:05 0<!DOCTYPE html PUBLIC & ... -
typeof
2013-06-06 08:35 0console.log(typeof ([])) //obj ...
相关推荐
### 理解JavaScript中的`caller`...综上所述,理解`caller`、`callee`、`call`、`apply`以及`arguments`对象在JavaScript编程中至关重要,它们不仅增强了函数的灵活性和复用性,还提供了深入分析和调试代码的强大工具。
这里的关键在于`apply`的使用,通过`[].slice.call(arguments)`将`arguments`对象转换为真正的数组,然后将`target`(即`this.data`)作为第一个参数插入到参数数组的前面,最后使用`apply`调用源方法,使得`util`...
总结,`call`和`apply`提供了改变函数执行上下文的能力,而`arguments`对象则允许我们方便地访问函数调用时的所有参数,这些都是JavaScript灵活性和动态性的体现。在实际开发中,掌握这些知识点对于编写高效和灵活的...
总的来说,`arguments.callee`提供了对当前执行函数的引用,而`call`和`apply`则是用来控制函数执行时的`this`值和参数。在编写JavaScript代码时,了解这些特性可以帮助你更好地理解和利用函数的作用域和上下文。
前端大厂最新面试题-bind_call_apply _bind、call、apply 是 JavaScript 中的三个函数方法,用于改变函数的执行上下文,即改变函数中的 this 指向。下面我们将详细讲解这三个方法的使用和区别。 作用 _bind、call...
这篇文章将深入探讨四个关键概念:caller、callee、call和apply,它们都是JavaScript函数操作的核心部分,对于理解和使用高级JavaScript编程至关重要。 首先,我们来了解`caller`和`callee`。在JavaScript的函数...
在提供的继承示例中,`baseA.call(this)`和`baseB.apply(this, arguments)`分别将`baseA`和`baseB`的构造函数调用上下文设为`this`,从而实现了继承。 此外,`call`和`apply`还可以用于处理数组或类数组对象。比如...
A.apply(this, arguments); }; B.prototype.getName = function() { return this.name; }; var b = new B('刘备'); alert(b.getName()); // 弹出 "刘备" ``` 4. **封装一个通用函数**:在使用jQuery等库时...
一、call和apply的说明 1、call,apply都属于Function.prototype的一个方法,它是JavaScript...2、语法:foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments) == this.foo(arg1, arg2, arg3); 3、相同点:两
JavaScript中arguments、caller、callee、call和apply是与函数相关的几个重要概念和对象。它们为JavaScript的函数提供了非常灵活的功能,特别是在处理函数参数和调用上下文方面。接下来,将对这些概念逐一进行详细...
在JavaScript中,实现对象继承主要有三种方式:原型链继承(prototype)、构造函数继承和call/apply继承。下面将分别详细介绍这三种继承方式的具体用法和实现原理。 1. 原型链继承(prototype) 原型链继承是...
例如,`Array.prototype.push.call(arguments, value)`可以在`arguments`对象上执行`push`方法,因为`arguments`虽然类似数组,但并不是真正的数组。 3. **模拟私有方法**: JavaScript中没有内置的私有方法机制,...
JavaScript中的call、apply和bind方法都是用来改变函数调用时的上下文(即this值)以及传递参数。它们之间的相同点在于,都能够指定函数执行时的this对象,并且都能接收参数。不同点在于它们的调用方式和执行时机。 ...
此外,`call`和`apply`也常用于处理类数组对象,比如`arguments`对象或者`NodeList`。由于这些对象没有标准数组的方法,如`push`或`pop`,我们可以利用`call`或`apply`来调用数组的方法。例如,可以使用`Array....
在JavaScript中,`apply`和`call`方法都是Function对象的内置方法,它们的主要作用是改变函数调用时的上下文(即`this`值),并允许我们在不同对象上执行同一方法,从而实现方法的借用。这两者在功能上相似,但参数...
在JavaScript的世界里,caller、callee、call和apply是四个非常重要的概念,它们涉及到函数的调用方式和执行上下文。这些知识点对于深入理解和优化代码至关重要,尤其在处理高阶函数和面向对象编程时。 首先,让...
在JavaScript中,每个函数都有`call()`和`apply()`这两个方法,它们都可以改变函数执行时的上下文,并传入参数。`apply()`的独特之处在于,它可以接受一个数组或类数组对象作为参数,将数组中的元素作为单独的参数...
JavaScript 中的 `call()` 和 `apply()` 方法是两种非常重要的函数调用方式,它们在继承和对象间共享行为时发挥着关键作用。本文将详细解析这两种方法的定义、用途以及如何在实际场景中应用。 1. `call()` 方法 `...
比如,有时候需要将数组的方法应用到类数组对象上(如arguments对象或者NodeList),这就可以通过apply来实现。 总结来说,call和apply在JavaScript中是非常实用的方法,它们提供了强大的能力,让我们能够在不同的...