首先介绍用非常类似java和C++中的方法来实现类的继承。利用JavaScript的函数来声明类,然后用new关键字来实例化对象。暂时叫它classical继承方法吧。
/* 创建父类Person */ function Person(name) { this.name = name; } /* 为父类添加getName方法 */ Person.prototype.getName = function() { return this.name; } /* 创建子类Author继续Person */ function Author(name, books) { Person.call(this, name); //调用父类Person的构造方法 this.books = books; //为Author添加一个books属性 } Author.prototype = new Person(); //创建原型链 Author.prototype.constructor = Author; //由于上一行中创建原型链使得Author中原有的constructor被覆盖因此必须还原Author的原型链,防止原型链断裂 Author.prototype.getBooks = function() { //为Author添加一个方法 return this.books; }; var author = new Author("Dustin Diaz", [ "数据结构" ]); alert(author.getName()); alert(author.getBooks()); 相信大多数的java和c++程序员来说上面的例子非常容易就可以理解。下面我们来看另一种方法用原型来实现类的继承。我们可以叫它prototypal继承。
function clone(object) { function F() { };//创建一个空函数 F.prototype = object; return new F; } /* 父类Person原型对象 */ var Person = { name : "default name", getName : function() { return this.name; } }; /* 子类Author原型对象 */ var Author = clone(Person); Author.books = []; // 默认值 Author.getBooks = function() { return this.books; } author = clone(Author); alert(author.getName()); // 输出结果为default name
这种方法对于很多第一次接触prototype的程序员来说是比较难以理解的。这个例子中我们没有定义化类似类的结构,仅仅定义了原型对象。由于有原型对象的存在,所以这些原型对象能够被其它的新对象运用。
总结:第一种方法很容易理解,所以在这种方法是最常见的。如果你希望的的javascript框架能够被广泛使用,你最好的选择就是第一种方法了,因为不是所有的程序员都能够很好的理解prototype的机制的。第二种方法优点就是是占用内存少,因为所有的clone对象都共用属性和方法,同时它很易用,只用调用一下clone就实现了类的继承,一句话因为简单所以强大。