抽象類是一種聲明可是不能使用的類,當使用時就會報錯。在JavaScript中,abstract仍是一個保留字,不能像傳統的面嚮對象語言那樣輕鬆建立。可是JavaScript是靈活的,能夠在類的方法中手動地拋出錯誤來模擬抽象類。以下:緩存
var Car = function(){}; Car.prototype = { getPrice:function () { return new Error('抽象方法不能調用'); }, getSpeed:function () { return new Error('抽象方法不能調用'); } }
建立的car類什麼都不能作,建立時沒有任何屬性,原型的方法也不能使用,可是在繼承時頗有用。由於父類定義了一些必要的方法,若是子類沒有重寫這些方法,那麼調用時找到這些類就會報錯。
當這些必要的方法從父類繼承過來而沒有具體去重寫實現,那麼實例化對象便會調用父類的這些方法,若是父類有友好提示,則對於忘記重寫子類的錯誤的避免就會頗有幫助。測試
抽象工廠其實是一個實現子類繼承父類的,在這個方法中須要傳遞子類以及要繼承父類的名稱,而且在抽象工廠方法中增長了一次對抽象類存在性的一次判斷,若是存在,則將子類繼承父類的方法,而後子類經過寄生式繼承。
抽象工廠方法this
var VehicleFactory = function (subType,superType) { //判斷抽象工廠是否有該抽象類 if(typeof VehicleFactory[superType] === 'function'){ //緩存類 function F() {}; //繼承父類屬性和方法 F.prototype = new VehicleFactory[superType](); //將子類constructor指向子類 subType.constructor = subType; //子類原型繼承"父類」 subType.prototype = new F(); }else { //不存在該抽象類拋出錯誤 throw new Error('未建立該抽象類'); } }
抽象類prototype
//小汽車抽象類 VehicleFactory.Car = function () { this.type = 'Car'; }; VehicleFactory.Car.prototype = { getPrice:function () { return new Error('抽象方法不能調用'); }, getSpeed:function () { return new Error('抽象方法不能調用'); } } //貨車抽象類 VehicleFactory.Truck = function () { this.type = 'Truck'; }; VehicleFactory.Truck.prototype = { getPrice:function () { return new Error('抽象方法不能調用'); }, getSpeed:function () { return new Error('抽象方法不能調用'); } }
抽象工廠實現對抽象類的繼承code
//寶馬汽車子類 var BMW = function (price,speed) { this.price = price; this.speed = speed; } //抽象工廠實現對Car抽象類的繼承 VehicleFactory(BMW,'Car'); BMW.prototype.getPrice = function () { return this.price; } BMW.prototype.getSpeed = function () { return this.speed; } //奔馳汽車子類 var BenzTruck = function(price,trainLoad){ this.price = price; this.trainLoad = trainLoad; } //抽象工廠實現對Truck抽象類的繼承 VehicleFactory(BenzTruck,'Truck') BenzTruck.prototype.getPrice = function () { return this.price; } BenzTruck.prototype.getTrained = function () { return this.trainLoad; }
經過抽象工廠,就知道每一個子類究竟是哪種類別,而後它們也具備了該類所必備的屬性和方法了。
測試對象
//測試 var truck = new BenzTruck(1000,100); console.log(truck.getPrice());//1000 console.log(truck.type);//Truck var car = new BMW(10,5); console.log(car.getPrice());//10 console.log(car.getSpeed());//5