与javascript类式继承1不同的是,在2中的extend扩展了一个superClass属性,为了降低子类对父类的耦合度,
在1中Author要想继承父类的属性必须使用Person.call(this,[argument])方法,这样会导致子类对父类的高耦合
在2中我们改写Author的构造函数,并使用extend中定义的superClass属性,Author.superClass.constructor.call(this,[argument])来继承父类的属性。
代码12行中是对父类构造是否指向正确的判断。
1 (function () {
2
3 function extend(subClass, superClass) {
4 function f() {
5 }
6
7 f.prototype = superClass.prototype;
8 subClass.prototype = new f();
9 subClass.prototype.constructor = subClass;
10
11 subClass.superClass = superClass.prototype;
12 if (superClass.prototype.constructor == Object.prototype.constructor) {
13 superClass.prototype.constructor = superClass;
14 }
15 }
16
17 function Person(age) {
18 this.age = age;
19 }
20
21 Person.prototype.getAge = function () {
22 return this.age;
23 }
24
25 function Author(age, books) {
26 Author.superClass.constructor.call(this, age);
27 this.books = books;
28 }
29
30 extend(Author, Person);
31 var a1 = new Author(21, "asd");
32 console.log(a1.getAge());
33
34
35 })()