JavaScript基本概念初级讲解论坛贴的学习记录

  1.关于this对象

  

复制代码 代码如下:

  view plaincopy to clipboardprint?

  var obj1=new Object();

  var obj2=new Object();

  //给两个对象都添加属性p,并分别等于1和2

  obj1.p=1;

  obj2.p=2;

  //给obj1添加方法,用于显示p的值

  obj1.getP=function(){

  alert(this.p); //表面上this指针指向的是obj1

  }

  //调用obj1的getP方法,结果显示为1

  obj1.getP();

  //使obj2的getP方法等于obj1的getP方法

  obj2.getP=obj1.getP;

  //调用obj2的getP方法,结果显示为2

  obj2.getP();

  var obj1=new Object();

  var obj2=new Object();

  //给两个对象都添加属性p,并分别等于1和2

  obj1.p=1;

  obj2.p=2;

  //给obj1添加方法,用于显示p的值

  obj1.getP=function(){

  alert(this.p); //表面上this指针指向的是obj1

  }

  //调用obj1的getP方法,结果显示为1

  obj1.getP();

  //使obj2的getP方法等于obj1的getP方法

  obj2.getP=obj1.getP;

  //调用obj2的getP方法,结果显示为2

  obj2.getP();

  2.关于函数对象

  

  

复制代码 代码如下:

  //增加函数对象方法method1

  Function.prototype.method1=function(){

  alert("function1");

  }

  function func1(a,b,c){

  return a+b+c;

  }

  func1.method1(); //提示:function1

  func1.method1.method1(); //提示:function1

  //增加对象方法getType,既包括普通对象也包括函数对象

  Object.prototype.getType=function(){

  return typeof(this);

  }

  var array1=new Array();

  function func1(a,b){

  return a+b;

  }

  alert(array1.getType()); //提示:object

  alert(func1.getType()); //提示:function

  //func2作为一个对象传递给了func1的形参theFunc,再由func1内部进行theFunc的调用

  function func1(theFunc){

  theFunc();

  }

  function func2(){

  alert("ok");

  }

  func1(func2); //提示:ok

  //当进行函数调用时,除了指定的参数外,还创建一个隐含的对象arguments

  function func(a,b){

  alert(a);

  alert(b);

  for(var i=0;i<arguments.length;i++){

  alert(arguments[i]);

  }

  }

  func(1,2,3); //提示:1,2,3

  /*

  arguments对象的另一个属性是callee,

  它表示对函数对象本身的引用.

  这有利于实现无名函数的递归或者保证函数的封装性.

  */

  var sum=function(n){

  if(1==n)

  return 1;

  else

  return n+arguments.callee(n-1);

  }

  alert(sum(100)); //提示:5050

  /*

  JavaScript为函数对象定义了两个方法:apply和call.

  它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别:

  以下是引用片段:

  Function.prototype.apply(thisArg,argArray);

  Function.prototype.call(thisArg[,arg1[,arg2…]]);

  从函数原型可以看到,第一个参数都被取名为thisArg,

  即所有函数内部的this指针都会被赋值为thisArg,

  这就实现了将函数作为另外一个对象的方法运行的目的。

  两个方法除了thisArg参数,都是为Function对象传递的参数。

  */

  //定义一个函数func1,具有属性p和方法A

  function func1(){

  this.p="func1-";

  this.A=function(arg){

  alert(this.p+arg);

  }

  }

  //定义一个函数func2,具有属性p和方法B

  function func2(){

  this.p="func2-";

  this.B=function(arg){

  alert(this.p+arg);

  }

  }

  var obj1=new func1();

  var obj2=new func2();

  obj1.A("byA"); //显示func1-byA

  obj2.B("byB"); //显示func2-byB

  obj1.A.apply(obj2,["byA"]); //显示func2-byA,其中[“byA”]是仅有一个元素的数组,下同

  obj2.B.apply(obj1,["byB"]); //显示func1-byB

  obj1.A.call(obj2,"byA"); //显示func2-byA

  obj2.B.call(obj1,"byB"); //显示func1-byB

  /*

  可以看出,obj1的方法A被绑定到obj2运行后,

  整个函数A的运行环境就转移到了obj2,即this指针指向了obj2。

  同样,obj2的函数B也可以绑定到obj1对象去运行。

  代码的最后4行显示了apply和call函数参数形式的区别。

  */

  /*

  与arguments的length属性不同,

  函数对象还有一个属性length,

  它表示函数定义时所指定参数的个数,

  而非调用时实际传递的参数个数

  */

  function sum(a,b){

  return a+b;

  }

  alert(sum.length);