首先看面向对象的继承实现代码示例:
- // define the Person Class
- function Person() {}
- Person.prototype.walk = function(){
- alert ('I am walking!');
- };
- Person.prototype.sayHello = function(){
- alert ('hello');
- };
- // define the Student class
- function Student() {
- // Call the parent constructor
- Person.call(this);
- }
- // inherit Person
- Student.prototype = new Person();
- // correct the constructor pointer because it points to Person
- Student.prototype.constructor = Student;
- // replace the sayHello method
- Student.prototype.sayHello = function(){
- alert('hi, I am a student');
- }
- // add sayGoodBye method
- Student.prototype.sayGoodBye = function(){
- alert('goodBye');
- }
- var student1 = new Student();
- student1.sayHello();
- student1.walk();
- student1.sayGoodBye();
- // check inheritance
- alert(student1 instanceof Person); // true
- alert(student1 instanceof Student); // true
在 JavaScript 中,对象分为两种。一种可以称为“普通对象”,就是我们所普遍理解的那些:数字、日期、用户自定义的对象(如:{})等等。
还有一种,称为“方法对象”,就是我们通常定义的 function。你可能觉得奇怪:方法就是方法,怎么成了对象了?但是在 JavaScript 中,方法的确是被当成对象来处理的。下面是一个简单的例子:
- function func() {alert('Hello!');}
- alert(func.toString());
- func.name = “I am func.”;
- alert(func.name);
- func();
话说每一个方法对象被创建时,都会自动的拥有一个叫prototype的属性。这个属性并无什么特别之处,它和其他的属性一样可以访问,可以赋值。不过当我们用 new 关键字来创建一个对象的时候,prototype 就起作用了:它的值(也是一个对象)所包含的所有属性,都会被复制到新创建的那个对象上去。下面是一个例子:
- func.prototype.name=”prototype of func”;
- var f = new func();
- alert(f.name);
- function func() {
- this.name=”name has been changed.”
- }
- func.prototype.name=”prototype of func”;
- var f = new func();
- alert(f.name);
- 创建一个新的普通对象;
- 将方法对象的 prototype 属性的所有属性复制到新的普通对象中去。
- 以新的普通对象作为上下文来执行方法对象。
对于“new func()”这样的语句,可以描述为“从 func 创建一个新对象”。总之,prototype 这个属性的唯一特殊之处,就是在创建新对象的时候了。
那么我们就可以利用这一点。比如有两个方法对象 A 和 B,既然从 A 创建的新对象包含了所有 A.prototype 的属性,那么我将它赋给 B.prototype,那么从 B 创建的新对象不也有同样的属性了?写成代码就是这样:
- A.prototype.hello = function(){alert('Hello!');}
- B.prototype = new A();
- new B().hello();
JavaScript 中面向对象的原理,就是上面这些了。自始至终我都没提到“类”的概念,因为 JavaScript 本来就没有“类”这个东西。面向对象可以没有类吗?当然可以。先有类,然后再有对象,这本来就不合理,因为类本来是从对象中归纳出来的,先有对象再有类,这才合理。像下面这样的:
- var o = {}; // 我发现了一个东西。
- o.eat = function(){return "I am eating."} // 我发现它会吃;
- o.sleep = function(){return "ZZZzzz..."} // 我发现它会睡;
- o.talk = function(){return "Hi!"} // 我发现它会说话;
- o.think = function(){return "Hmmm..."} // 我发现它还会思考。
- var Human = new Function(); // 我决定给它起名叫“人”。
- Human.prototype = o; // 这个东西就代表了所有“人”的概念。
- var h = new Human(); // 当我发现其他同它一样的东西,
- alert(h.talk()) // 我就知道它也是“人”了!
Thanks:
https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript