对于javascript的面向对象有不少说法,有的说,javascript不是面向对象的,有的说javascript是基于对象的,有的说使用javascript可以实现面向对象。
我 查阅了一些资料,包括ECMAscript Language Specification Edition 3 24-Mar-00,似乎应该说成javascript是基于原型(prototype-based )的面向对象,而C++,java之类的是基于类的面向对象,即面向对象的实现方式不同。面向对象并不必然是基于class的。一篇文章中提到的面向对象 最主要的三个特性
* Encapsulation(封装) - Support for method calls on a Javascript object as a member of a Class.
* Polymorphism(多态)- The ability for two classes to respond to the same (collection of) methods.
* Inheritance (继承)- The ability to define the behavior of one object in terms of another by sub-classing.
在javascript里都可实现。
感觉对于理解javascript的面向对象特性,有这样几点需要注意,
1、将面向对象作为一个独立的通用概念,面向对象有不同的实现方式,也有不同的扩展。C++的面向对象和java不完全相同,javascript和他们也不完全相同。
2、对于java程序员需要知道javascript里的对象和java里所谈的对象(实例)有很大不同。
3、函数也是对象,是可以作为构造器的对象,是可以产生对象的对象。因为javascript里所谓对象就是指属性的无序集合。函数可以添加属性,所以也是对象。
4、进一步了解new和prototype的定义。
5、 再对java程序员说一句,对象,在javascript里非函数的对象,最类似java里的对象(实例),java里对象有属性,有方法,在 javascript里对象只有属性,所谓的方法就是函数类型的属性,引用一般属性可以写成o.x,也可以写成o["x"],使用对象的方法也同样o.f ()可以,o["f"]()也可以。另外你所引用的对象的属性可以是对象本身的属性,也可以是该对象的构造函数的原型的属性。
6、我以前总是对照java来理解javascript,但现在看理解了C++或C的函数指针的概念,将javascript类比C或C++似乎更自然些。
具体一点说:
对 某函数对象比如Foo执行new操作时,首先会生成一个新对象,一个非函数类型的对象,然后执行Foo,在Foo的函数体中,this代指新创建的函数, 这种操作称为将函数作为构造器(constructor)使用,接着还会将该对象与Foo的原型(Prototype)建立联系。
var Foo = function(){
this.x = "abc";
this.sayHello1 = function(){alert("hello你个头!");}
};
Foo.sayHello2 = function(){alert("你hello个头!");}

Foo.prototype.sayHello3 = function(){alert("你个头hello!");}

var foo = new Foo;
foo.sayHello4 = function(){alert("晕!");};
foo.sayHello1();
//如果把Foo当作类定义的话,sayHello2可以被理解为静态方法
//但和java不同的是,foo.sayHello2();就会抱错。
Foo.sayHello2();
//在foo的属性里并没有sayHello3这个函数对象,但在foo的构造函数的
//原型对象里有这个函数属性,所以可以这么来调用,如果foo的构造函数的
//原型对象里也没这个属性的话,就会到这个原型对象的构造函数
//的原型对象里去找,以此类推。本例没有体现这一点,今天太晚了,
//下一篇里,我会在介绍javascript的几个面向对象的实现方式里写个这样的例子。
foo.sayHello3();
foo.sayHello4();
foo["sayHello4"]();
alert(foo.x);