JavaScript面向对象特性

来源:互联网 发布:reduce() python 编辑:程序博客网 时间:2024/05/16 14:03

1.null和undefined

null是JavaScript的一个关键字,它表示空值。null可以看做是Object类型的一个特殊值,如果一个对象的值是null,其含义就是该对象不是一个有效的对象。

undefined不是JavaScript的关键字,它是一个全局变量,也就是Global对象的一个属性值。在JavaScript中,有以下3种可能的情况会返回undefined:

(1) 使用了一个未定义的变量

(2)使用了已经定义但是没有赋值的变量

(3)使用了一个对象的属性,但是该属性不存在或者未赋值

虽然undefined和null不同,但是运行下面的代码会返回true

alert(undefined==null);

下面的代码运行结果也会返回true

var v="";

alert(v.a==null);

alert(v.a==undefined);

这是因为undefined和null都代表了值的缺失,所以在这里他们是等值的。当然它们不是完全相等,因此下面的代码会返回false

alert(undefined===null)


2.JS中的函数

JavaScript的Function对象在调用过程中具有一个arguments属性,它是由脚本解释器创建的(这也是创建arguments的惟一途径)。arguments属性可以看做是一个Array对象,它具有length属性,可以通过序号访问每一个参数,而且通过arguments的callee属性可以获取对只在执行的Function对象的引用。

callee属性的应用

function factorial(n){

    if(n<0){

   return -1;

}else{

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

}

}


alert(factorial(5));

例中的factorial函数实现了阶乘的计算,它利用callee属性完成了匿名的递归调用


Function对象的另一个属性是caller,它指向正在调用当前函数的父函数对象。利用callee和caller属性,可以很容易地实现对调用堆栈的遍历。


3.apply和call方法

apply方法和call方法有相似之处,两者都是将函数绑定到其他对象上执行的,区别在于调用参数的形式不同。调用apply和call方法的语法如下:

apply(thisObj[,argArray])

call(thisObj[,arg1[,arg2[,[,..argN]]]])

通过apply方法时,参数是通过Array对象传入的;而通过call方法时,参数是一次给出的


function ClassA() {

     this.prop="ClassA";

    this.methodA=function(msg){

    alert(this.prop+":"+msg);

}

}


function ClassB()  {

   this.prop ="ClassB";

   this.methodB=function (msg) {

  alert(this.prop+":"+msg);

}

}


var obj1=new ClassA();

var obj2=new ClassB();

obj1.methodA("msg1");   //输出"ClassA:msg1";

obj2.methosB("msg2");   //输出"ClassB:msg2";

obj1.methodA.apply(obj2,["msg1"]);   //输出“ClassB:msg1”;

obj2.methodB.apply(obj1,["msg2"]);    //输出"ClassA:msg2";

obj1.methodA.call(obj2,"msg1");      //输出“ClassB:msg1”;

obj2.methodB.call(obj1,"msg2");    //输出"ClassA:msg2"


4.this 和with  关键字

在JS中,this关键字常用于两种地方:

(1)  在构造器函数中,指代新创建的对象实例;

(2)  在对象的方法被调用时,指代调用该方法的对象实例

如果一个函数被当做普通函数调用,那么在函数中的this关键字将指向window对象。当然如果this关键字不在任何函数中,那么它也指向window对象。

JS中的with关键字通常用来缩短特定情形下必须编写的代码量

如:

x =Math.cos(3*Math.PI)  +Math.sin(Math.LN10);

y=Math.tan(14*Math.E);

当使用with语句时,代码变得更短且易读:

with(Math)

   x=cos(3*PI)+sin(LN10);

  y=tan(14*E);


5.FOR(.....in....)


使用其可以遍历对象的所有属性和方法

}