參考:http://bbs.51js.com/thread-74195-1-1.html
構造器
構造器代碼必須放在整個類定義的最後,這樣做是為了保證在它當中被調用的方法都已經被定義了。
私人執行個體成員[變數和方法]
私人執行個體成員在 JavaScript 中實際上可以用函數內的局部變數來實現,它相當於類的私人執行個體成員
他們只能在該類的對象內部被使用,在對象外無法使用。
建立私人方法有兩種方式,一種是直接在類中定義方法,另一種是先定義一個局部變數(私人執行個體欄位),然後定義一個匿名方法賦值給它。
公有執行個體成員:兩種方法,prototype 和this定義
1、prototype 方式只應該在類外定義。this 方式只能在類中定義。
2、prototype 方式如果在類中定義時,則存取私人執行個體成員時,總是存取最後一個對象執行個體中的私人執行個體成員。
3、prototype 方式定義的公有執行個體成員是建立在類的原型之上的成員。this 方式定義的公有執行個體成員,是直接建立在類的執行個體對象上的成員。
基於前兩點區別,我們可以得到這樣的結論:如果要在公有執行個體方法中存取私人執行個體成員,那麼必須用 this 方式定義。
關於第三點區別,我們後面在討論繼承時再對它進行更深入的剖析。這裡只要知道有這個區別就可以了。
不要把通過 prototype 方式建立的公有執行個體方法定義在類的內部!
公有靜態成員
定義的方式就是給 className.memberName 直接賦值。
一定不要將公有靜態成員定義在它所在的類的內部
靜態類
myClass = new function() {...}
繼承:一種是原型繼承法,一種是調用繼承法
[原型繼承法]
子類繼承來的公有執行個體方法中,如果調用了私人執行個體欄位或者私人執行個體方法,則所調用的這些私人執行個體成員是屬於父類的。
子類中定義的執行個體方法,如果調用了私人執行個體欄位或者私人執行個體方法,則所調用的這些私人執行個體成員是屬於子類的。
定義在父類原型上的方法,會被子類繼承。
子類中定義的執行個體方法是不能訪問父類中定義的私人執行個體成員的。
靜態成員是不會被繼承的。
[調用繼承法]
定義在父類原型上的方法,不會被子類繼承。
子類中定義的執行個體方法同樣不能訪問父類中定義的私人執行個體成員的。
靜態成員同樣不會被繼承的。
是通過調用繼承法,可以實現多繼承。也就是說,一個子類可以從多個父類中繼承通過 this 方式定義在父類內部的所有公有執行個體成員。
function subClass() {
// inherit
parentClass.call(this);
方法重載樣本
function parentClass() {
this.method = function() {
alert("parentClass method");
}
}
function subClass() {
var method = this.method;
this.method = function() {
method.call(this);
alert("subClass method");
}
}
subClass.prototype = new parentClass();
subClass.prototype.constructor = subClass;
var o = new subClass();
o.method();