模擬重載##
通過判斷實際傳入的參數的個數實現模擬重載
if(typeof args[0] === "object" && args[0])
// 當對象為null時,用typeof判斷也是object,所以還要判斷是否為空
調用子類方法實現繼承##
調用基類(父類)的方法和屬性
Person.call(this,name);
子類的方法覆蓋了基類的方法,在子類中想用父類的初始化,就用Person.prototype.init.apply(this,arguments);
鏈實現式調用##
addclass函數里面return this;返回的是classmanager的實例。通過返回this實現鏈式調用
模擬抽象類##
想要子類去覆蓋,但是不想被直接調用的方法,同樣可以通過拋出異常的方式實現
在抽象類中拋出異常,防止抽象類直接被調用。
通過拋出異常,限制只能通過new調用
通過es5方法控制對象屬性##
實現模塊化##
容器探測器和link探測器###
兩種方法:立即執行的匿名函數,返回對象;
構造器方法,通過設置this的值,默認返回this。
練習-實現探測器##
先實現原型鏈的繼承,再擴展。
因為繼承的時候會改寫prototype屬性,如果后繼承可能會覆蓋掉之前的prototype屬性。
Object.freeze(obj);// ES5 凍結對象,不可刪不可擴展也不可寫。
整個探測器包含在一個立即執行匿名函數里,可以防止變量或函數聲明泄露到外面
在功能上
1.先聲明一個DetectorBase函數基類,帶一個參數,作為其子類的參數接口。然后為該函數創建一個detect方法,由于DetectorBase不是一個具體的探測器,所以它的detect方法是沒有意義的,但為了說明該類擁有該方法,可以直接拋出一個異常,作為一個抽象方法,避免被調用。
2.接著聲明兩個具體的探測器,并在其后建立與DetectorBase的繼承關系,然后再為兩個探測器創建各自的detect方法。
保護機制
1.將函數及其原型冰凍,防止增刪屬性及屬性標簽被修改
2.通過defineProperty將三個函數的屬性標簽設置為不可寫、不可刪除、不可枚舉,達到既可以將函數暴露出來,又防止被修改、刪除或枚舉。