`
cxy020
  • 浏览: 63566 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

js call和apply

阅读更多
官方定义:调用一个对象的一个方法,以另一个对象替换当前对象。
我对js里面call和apply的理解是回调父类的方法,并将父类实例化到当前对象的prototype上。
其实对此一直都比较模糊,只能通过一些例子来加深一些理解。

var color = "red";
function sayColor(p) {
	alert(p + this.color);
};
sayColor();//弹出undefinedred;
var obj = new Object();
obj.color = "blue";
sayColor.call(obj, "color is ");//弹出color is blue
//sayColor.apply(obj, ["color is "]);

/*
第一次 调用sayColor 里面的this 的上下文是window 所以this.color = red;
第二次 sayColor.call(obj, "color is ");obj是传过去的上下文,"color is "是参数(可传多个)
所以当执行sayColor的时候 this就是obj,this.color = blue;
*/

function ClassA(c) {
         this.color = c;
	this.sayColor = function () {
		alert(this.color);
	};
}

function ClassB(c, n) {
	ClassA.apply(this, arguments);
	this.name = n;
	this.sayName = function () {
		alert(this.name);
	};
}
var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor();	//输出 "blue"
objB.sayColor();	//输出 "red"
objB.sayName();	//输出 "John"

/*
以上的例子 我们可以知道
1.apply方法 改变 ClassA的 this 传过去的this==ClassB ; arguments == [c,n]
2.ClassB继承了 ClassA的sayColor方法
在这里就有一个疑问了 这样的继承是否就跟prototype 一样呢?
*/
function ClassA(c) {
	this.color = c;
}
ClassA.prototype.sayColor = function () {
	alert(this.color);
};
function ClassB(c, n) {
	ClassA.call(this, c);
	this.name = n;
}

var objB = new ClassB("red", "cxy");
objB.sayColor();	//运行报错 不存在这个方法

/*
由此可见ClassB并没有完全继承ClassA。
有一种解释是 call/apply 是继承实例对象,而prototype是继承原型对象。
更通俗一些是 call/apply 是值类型的继承,而prototype是引用类型的继承。
*/

给一个完整的例子
function ClassA(c) {
	this.color = c;
}
ClassA.prototype.sayColor = function () {
	alert(this.color);
};
function ClassB(c, n) {
	ClassA.call(this, c);
	this.name = n;
}
ClassB.prototype = new ClassA();
ClassB.prototype.sayName = function () {
	alert(this.name);
};

var objA = new ClassA("blue");
var objB = new ClassB("red", "cxy");
objA.sayColor();	//输出 "blue"
objB.sayColor();	//输出 "red"
objB.sayName();	//输出 "cxy"


本文,作为抛砖引玉,只对 call和apply 的用法做个小例子,其他更深入的应用要
靠大家慢慢去领会了。

欢迎大家多多 拍砖!
分享到:
评论
2 楼 hanazawakana 2012-11-06  
倒数第二个例子,关于为什么B没有继承A,我觉得也可以这样理解,B之所以没有继承A的prototype属性是由于A类并没有创建一个实例。一个类的prototype对象的属性必须需要实例化后才能拥有。
1 楼 tk1012 2012-06-04  
good

相关推荐

    JavaScript中call与apply方法

    JavaScript中call与apply方法

    关于Javascript中call与apply的进一步探讨

    在JavaScript中,`call`和`apply`是两个非常重要的方法,它们都用于改变函数调用时的上下文(即`this`的值),并且可以灵活地传递参数。本篇文章将深入探讨这两个方法的用法、区别以及实际应用场景。 `call`方法...

    javascript中apply和call方法的作用及区别说明

    一、call和apply的说明 1、call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为...

    Javascript call和apply区别及使用方法

    ### Javascript call和apply区别及使用方法 在JavaScript中,`call`和`apply`方法被用于显式地设定函数体内`this`的值,这是所谓的函数借用(method borrowing)或函数上下文改变(context changing)。它们使得一...

    javascript callApply代码示例

    javascript callApply代码示例

    理解JavaScript的caller callee call apply

    ### 理解JavaScript中的`caller`...综上所述,理解`caller`、`callee`、`call`、`apply`以及`arguments`对象在JavaScript编程中至关重要,它们不仅增强了函数的灵活性和复用性,还提供了深入分析和调试代码的强大工具。

    js中call与apply的用法小结

    在JavaScript中,`call` 和 `apply` 是两种非常重要的函数调用方式,它们都用于改变函数执行时的上下文,即`this`的指向。本文将深入探讨这两种方法的用法及其在实际编程中的应用。 ### 1. `call` 的基本用法 `...

    javascript call和apply方法

    在JavaScript中,`call`和`apply`是两种非常重要的函数调用方式,它们都用于改变函数执行时的上下文,即`this`的指向。`this`在JavaScript中是一个非常关键的概念,它通常指代函数执行时所在的对象。下面我们将深入...

    Js的call与apply1

    JavaScript中的`call`和`apply`是两种非常关键的方法,它们允许我们改变函数内部`this`的指向,同时也为实现模拟继承提供了可能。虽然JavaScript不直接支持类继承,但通过`call`和`apply`,我们可以实现类似的效果。...

    详解js中call与apply关键字的作用

    在JavaScript中,call与apply是两个非常...call和apply在JavaScript中的运用广泛且灵活,无论是改变函数上下文还是借用其他对象的方法,它们都能起到很大的作用。掌握这两者,可以让你的JavaScript编程更加高效和优雅。

    淡淡简单描述javascript中方法apply和call

    淡淡简单描述javascript中方法apply和call

    Javascript - 全面理解 caller,callee,call,apply (转载)

    这篇文章将深入探讨四个关键概念:caller、callee、call和apply,它们都是JavaScript函数操作的核心部分,对于理解和使用高级JavaScript编程至关重要。 首先,我们来了解`caller`和`callee`。在JavaScript的函数...

    javascript中call和apply方法浅谈

    当`call`和`apply`的第一个参数为`null`或`undefined`时,`this`将默认指向全局对象(在浏览器环境中是`window`,在Node.js环境中是`global`)。例如: ```javascript var a = 10, b = 20; function testFun() { ...

    JavaScript中call和apply方法的区别实例分析

    本文实例分析了JavaScript中call和apply方法的区别。分享给大家供大家参考,具体如下: 这两个方法不经常用,但是在某些特殊场合中是非常有用的,下面主要说下它们的区别: 1、首先,JavaScript是一门面向对象的语言...

    call与apply区别 详细解读.pdf

    call和apply是JavaScript中的两个重要方法,它们都是Function.prototype中的方法,这意味着每个函数都可以使用这两个方法。它们的作用是改变函数体内的this对象的值,以扩充函数赖以运行的作用域。 相同点:call和...

    JS中的call、apply、bind方法详解.pdf

    JS中的call、apply、bind方法详解 随着JavaScript的发展,函数调用对象的改变变得越来越重要。在JavaScript中,call、apply、bind三个方法都是函数对象的方法,它们的作用都是改变函数的调用对象。下面,我们将详细...

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

    JavaScript 中的 call、apply、bind 方法详解 JavaScript 中的 call、apply、bind 方法是 Function 对象自带的三个方法,这三个方法的主要作用是转变函数中的 this 指向,从而可以达到“接花移木”的效果。下面将对...

    Javascript中call,apply,bind方法的详解与总结

    本文针对JavaScript中三个重要的函数方法——call、apply和bind,进行详尽的分析,并在文章的结尾部分对这三个方法之间的联系和区别进行了概括,以便于读者更深入地理解它们的用途和应用场景。 首先,我们来探讨...

    详解js中call与apply关键字的作用.docx

    JavaScript中的`call`和`apply`是两种非常重要的方法,它们都用于改变函数内部`this`的指向,并执行该函数。这两个方法都是Function对象的原型方法,因此所有的函数都具备`call`和`apply`。 1. `call`方法: - `...

Global site tag (gtag.js) - Google Analytics