原型式繼承
原型式繼承類似於一種單繼承,它利用prototype屬性,prototype可以整個複製一個對象,但是它不會從其他原型或者建構函式中繼承屬性,而屬性都是從實際對象那裡繼承過來的。
//建立Person的建構函式 function Person(name) { this.name = name; } //Person添加一個新方法 Person.prototype.getName = function () { return this.name; }; //建立User建構函式 function User(name, password) { //注意:這裡並沒有支援方便的重載和繼承,也就是說不能調用父類的建構函式 this.name = name; this.password = password; }; //User繼承所有的Person對象的方法 User.prototype = new Person(); //我們添加一個新方法到User對象中 User.prototype.getPassword = function () { return this.password; };
上面這個例子最重要的一行是User.prototype=new Person();. User是對User物件建構函數的引用。new Person()使用Person建構函式建立了一個新的Person對象,然後把User建構函式的原型置為這個操作的結果。也就是說,每當new User()的時候,得到的新User對象都會帶有Person對象所有的方法,如同通過操作new Person()得到的一樣。
類繼承
JS裡不支援java、c++那樣的類繼承方式,但是這種繼承方式在使用上是非常方便的。現在有很多JS類庫提供類似的解決方案,我們這裡看一下Prototype庫是如何?的呢。
// 建立一個名為 'Class'的全域對象 var Class = { //它只有一個函數,其作用是建立一個新的物件建構函數 create: function () { //建立一個匿名的物件建構函數 return function () { //調用它本身的初始化方法 this.initialize.apply(this, arguments); } } } //給Object對象添加一個新的靜態方法,它的作用是把屬性從一個對象複製到另一個中 Object.extend = function (destination, source) { //遍曆所有要擴充的屬性 for (property in source) { //然後把他們添加到目標對象中 destination[property] = source[property]; } //返回修改後的對象 return destination; }
拿來小用一下:
//建立一個新的建構函式為空白的Person對象 var Person = Class.create(); //將下面的函數複製到Person的prototype中 Object.extend(Person.prototype, { //這個函數由Person建構函式立即調用 initialize: function (name) { this.name = name; }, //Person對象的簡單函數 getName: function () { returnthis.name; } }); //建立一個建構函式為空白的User對象 var User = Class.create(); //User對象繼承了所有的父類的函數 User.prototype = Object.extend(new Person(), { //將父類的初始化函數重載為新的 initialize: function (name, password) { this.name = name; this.password = password; }, //給這個對象添加一個新的函數 getPassword: function () { returnthis.password; } }); //看看我們創造出來的兩個類吧 var person = new Person("Lisa"); var user = new User("Lisa", "123");
Prototype確實只使用了兩個簡單的函數來建立和管理整個物件導向結構,這兩個函數的出發點很簡單:
Class.create():整個函數僅僅使用一個匿名函數封裝起來作為建構函式。這種簡單的建構函式只做一件事情——調用並執行對象的initialize屬性。如果對象中不包含initialize屬性就會拋異常。
Object.extend():這個只是把所有屬性從一個對象複製到另一個對象。
雖然這個技術很複雜,但是提供的物件導向需要的準系統。