/*
看了网上很多类似的文章个人感觉介绍这2个方法时,应该先突出重点,本来是拉着一根绳子,后来拉出一条大象出来。譬如一些文章一开始就引用出继承这样的概念。
在这里我的建议是:call、apply方法就是改变了上下文(this)的指向,明白了这个概念再去理解继承这个概念就容易多了。
JavaScript 通过call/apply改变上下文之间的切换,这是最基本的用法。两个方法基本区别在于传参不同。
call(obj,arg1,arg2,arg3);call第一个参数传对象,可以是null。参数以逗号分开进行传值,参数可以是任何类型。
apply(obj,[,,,,]);apply第一个参数传对象,参数可以是数组或者arguments 对象。
*/
//apply,call都能改变调用函数的对象。
//如下例,函数中用到this关键字,这时候this代表的是apply,call函数的第一个参数。
function obj1(a, b){
alert(a + b);
alert(this.getd());//call方法改变了函数上下文指向(也就是this的指向),这里的this代表call方法的第一个参数。
//this.d="daad";
//alert(this);
}
function obj2(a, b){
//alert(a - b);
this.d="3332";
//alert(this);
}
//定义一个类属性
obj2.getd=function()
{
var obj=new obj2(3,4);
return obj.d;
}
obj1.call(obj2, 3, 1);// obj2即obj1函数内部的this,改变obj1内部this的指向。this(obj2)可以获取obj2一切的类属性及方法。
--------------------------------------------------------------------------------------------------------------------
/*
感觉有点像java中的父类、子类关系。
两个实例。但感觉还是没有违背上面例子所说的概念,改变了上下文(this)的指向是关键.
如下列:c1.showName.call(c2);
把c2引用交给了c1.所以该方法调用this.name将指向class2的name属性。
从if判断就可以看到,使用instanceof判断this对象是否是Class2这个对象。判断为:true
*/
function Class1()
{
this.name = "class1";
this.showNam = function()
{
if(this instanceof Class2)//true
{
alert(this.name);
}
}
}
function Class2()
{
this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();
c1.showNam.call(c2);
转载于:https://blog.51cto.com/honkershi/491821