/*

 看了网上很多类似的文章个人感觉介绍这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);