Javascript的类与对象
Javascript语言是动态类型的语言,基于对象并由事件驱动。用面向对象的思想来看,它也有类的概念。javascript 没有class关键字,就是用function来实现。
1. 实现方式及变量/方法访问域控制
1 function student(name,age)
2 {
3 // public variable
4 this.name=name;
5 this.age=age;
6 }
是用this来标识 变量或方法是public。
var zhang=new student('zhang',20);
跟其他大多数语言一样是用new 关键字来实例化一个类的对象。这样 zhang.name 的值就是 ‘zhang'。内部变量则使用var关键字:
function book()
{
var subject="太阳从东方升起";
}
var b1=new book();
这个时候访问b1.subject,得到的结果是"undefined"。
2. 类的扩展
Javascript是动态语言,因此我们可以在类创建之后再给他添加属性(field)或方法。具体做法就是使用prototype:
function student(name,age)
{
// public variable
this.name=name;
this.age=age;
}
var zhang=new student('zhang',20);
var li=new student('li',80);
//zhang.gender = 'undefined
student.prototype.gender=1;
//zhang.gender = 1
//li.gender = 1
//student.prototype.gender = 1
可以看到变量zhang,li都有了gender的属性,且值为1。
也有人把prototype扩展的内容称之为静态方法或属性,我认为这样称呼有些不太合适,因为静态的内容是不能通过对象来访问的,这里则可以,且如果更改zhang.gender,不会影响li.gender的值。另一个理由这里的gender不能像其他语言的静态属性一样直接是用类名来访问:
student.gender = 1 //error : student.gender undefined
只能这样:
student.prototype.gender // 值为 1
3.对象与数组的关系
var tom={};
//typeof(tom) //object
tom['Email']='qq@qq.com';
// tom.Email 值为 'qq@qq.com'
tom.Website="www.www.com";
// tom["Website"] 值为 "www.www.com"
由此可以见对象的field可以通过数组的方式访问,反之亦然。使用field的方式访问,从风格上讲更像面向对象的风格,但是是用数组方位在某些遍历对象的时候很是方便。