Fork me on GitHub

JavaScript面向对象编程

Javascript是一个类C的语言,他的面向对象的东西相对于C++/Java比较奇怪,但是其的确相当的强大,在 Todd 同学的“对象的消息模型”一文中我们已经可以看到一些端倪了。这两天有个前同事总在问我Javascript面向对象的东西,所以,索性写篇文章让他看去吧,这里这篇文章主要想从一个整体的角度来说明一下Javascript的面向对象的编程。
初探
我们知道Javascript中的变量定义基本如下:

1
2
3
var name = 'Chen Hao';;
var email = 'haoel(@)hotmail.com';
var website = 'http://coolshell.cn';

如果要用对象来写的话,就是下面这个样子:

1
2
3
4
5
var chenhao = {
name :'Chen Hao',
email : 'haoel(@)hotmail.com',
website : 'http://coolshell.cn'
};

于是,我就可以这样访问:

1
2
3
4
//以成员的方式
chenhao.name;
chenhao.email;
chenhao.website;

1
2
3
4
//以hash map的方式
chenhao["name"];
chenhao["email"];
chenhao["website"];

关于函数,我们知道Javascript的函数是这样的:

1
2
3
var doSomething = function(){
alert('Hello World.');
};

于是,我们可以这么干:

1
2
3
4
5
6
var sayHello = function(){
var hello = "Hello, I'm "+ this.name
+ ", my email is: " + this.email
+ ", my website is: " + this.website;
alert(hello);
};

//直接赋值,这里很像C/C++的函数指针

1
2
chenhao.Hello = sayHello;
chenhao.Hello();

相信这些东西都比较简单,大家都明白了。 可以看到javascript对象函数是直接声明,直接赋值,直接就用了。runtime的动态语言。

还有一种比较规范的写法是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//我们可以看到, 其用function来做class。
var Person = function(name, email, website){
this.name = name;
this.email = email;
this.website = website;

this.sayHello = function(){
var hello = "Hello, I'm "+ this.name + ", \n" +
"my email is: " + this.email + ", \n" +
"my website is: " + this.website;
alert(hello);
};
};

var chenhao = new Person("Chen Hao", "haoel@hotmail.com",
"http://coolshell.cn");
chenhao.sayHello();

顺便说一下,要删除对象的属性,很简单:

1
delete chenhao['email']

上面的这些例子,我们可以看到这样几点:
Javascript的数据和成员封装很简单。没有类完全是对象操作。纯动态!
Javascript function中的this指针很关键,如果没有的话,那就是局部变量或局部函数。
Javascript对象成员函数可以在使用时临时声明,并把一个全局函数直接赋过去就好了。
Javascript的成员函数可以在实例上进行修改,也就是说不同实例相同函数名的行为不一定一样。

参考 http://coolshell.cn/articles/6441.html