摘要:抽象類是一種聲明但是不能使用的類,當(dāng)使用時(shí)就會(huì)報(bào)錯(cuò)。但是是靈活的,可以在類的方法中手動(dòng)地拋出錯(cuò)誤來模擬抽象類。
抽象類是一種聲明但是不能使用的類,當(dāng)使用時(shí)就會(huì)報(bào)錯(cuò)。在JavaScript中,abstract還是一個(gè)保留字,不能像傳統(tǒng)的面向?qū)ο笳Z言那樣輕松創(chuàng)建。但是JavaScript是靈活的,可以在類的方法中手動(dòng)地拋出錯(cuò)誤來模擬抽象類。如下:
var Car = function(){}; Car.prototype = { getPrice:function () { return new Error("抽象方法不能調(diào)用"); }, getSpeed:function () { return new Error("抽象方法不能調(diào)用"); } }
創(chuàng)建的car類什么都不能做,創(chuàng)建時(shí)沒有任何屬性,原型的方法也不能使用,但是在繼承時(shí)很有用。因?yàn)楦割惗x了一些必要的方法,如果子類沒有重寫這些方法,那么調(diào)用時(shí)找到這些類就會(huì)報(bào)錯(cuò)。
當(dāng)這些必要的方法從父類繼承過來而沒有具體去重寫實(shí)現(xiàn),那么實(shí)例化對(duì)象便會(huì)調(diào)用父類的這些方法,如果父類有友好提示,則對(duì)于忘記重寫子類的錯(cuò)誤的避免就會(huì)很有幫助。
抽象工廠實(shí)際上是一個(gè)實(shí)現(xiàn)子類繼承父類的,在這個(gè)方法中需要傳遞子類以及要繼承父類的名稱,并且在抽象工廠方法中增加了一次對(duì)抽象類存在性的一次判斷,如果存在,則將子類繼承父類的方法,然后子類通過寄生式繼承。
抽象工廠方法
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 { //不存在該抽象類拋出錯(cuò)誤 throw new Error("未創(chuàng)建該抽象類"); } }
抽象類
//小汽車抽象類 VehicleFactory.Car = function () { this.type = "Car"; }; VehicleFactory.Car.prototype = { getPrice:function () { return new Error("抽象方法不能調(diào)用"); }, getSpeed:function () { return new Error("抽象方法不能調(diào)用"); } } //貨車抽象類 VehicleFactory.Truck = function () { this.type = "Truck"; }; VehicleFactory.Truck.prototype = { getPrice:function () { return new Error("抽象方法不能調(diào)用"); }, getSpeed:function () { return new Error("抽象方法不能調(diào)用"); } }
抽象工廠實(shí)現(xiàn)對(duì)抽象類的繼承
//寶馬汽車子類 var BMW = function (price,speed) { this.price = price; this.speed = speed; } //抽象工廠實(shí)現(xiàn)對(duì)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; } //抽象工廠實(shí)現(xiàn)對(duì)Truck抽象類的繼承 VehicleFactory(BenzTruck,"Truck") BenzTruck.prototype.getPrice = function () { return this.price; } BenzTruck.prototype.getTrained = function () { return this.trainLoad; }
通過抽象工廠,就知道每個(gè)子類到底是哪一種類別,然后它們也具有了該類所必備的屬性和方法了。
測(cè)試
//測(cè)試 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
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98037.html
摘要:基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。工廠方法模式總結(jié)工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。 JavaScript工廠模式 首先需要說一下工廠模式。工廠模式根據(jù)抽象程度的不同分為三種 簡(jiǎn)單工廠模式 工廠方法模式 抽象工廠模式 1.簡(jiǎn)單工廠模式 簡(jiǎn)單工廠模式:又稱為靜態(tài)工廠方法...
摘要:前言接下來將會(huì)為大家介紹設(shè)計(jì)模式中的創(chuàng)建型設(shè)計(jì)模式,在此之前需要掌握一定的對(duì)象繼承基礎(chǔ)。但是如果是工廠方法模式的話,則只需要往工廠方法中添加基類則可以。 前言 接下來將會(huì)為大家介紹設(shè)計(jì)模式中的創(chuàng)建型設(shè)計(jì)模式,在此之前需要掌握一定的JavaScript對(duì)象繼承基礎(chǔ)。 簡(jiǎn)單工廠模式 先說說 什么是簡(jiǎn)單工廠模式:又叫靜態(tài)工廠方法,由一個(gè)工廠對(duì)象決定創(chuàng)建某一種產(chǎn)品對(duì)象類的實(shí)例 看著定義有點(diǎn)懵,...
摘要:簡(jiǎn)單工廠模式簡(jiǎn)單工廠模式又叫靜態(tài)工廠模式,由一個(gè)工廠對(duì)象決定創(chuàng)建某一種產(chǎn)品對(duì)象類的實(shí)例。工廠方法模式工廠方法模式的本意是將實(shí)際創(chuàng)建對(duì)象的工作推遲到子類中,這樣核心類就變成了抽象類。抽象工廠模式一般用在 1 什么是工廠模式? 工廠模式是用來創(chuàng)建對(duì)象的一種最常用的設(shè)計(jì)模式。我們不暴露創(chuàng)建對(duì)象的具體邏輯,而是將將邏輯封裝在一個(gè)函數(shù)中,那么這個(gè)函數(shù)就可以被視為一個(gè)工廠。工廠模式根據(jù)抽象程度的不...
摘要:簡(jiǎn)單工廠模式簡(jiǎn)單工廠模式又叫靜態(tài)工廠模式,由一個(gè)工廠對(duì)象決定創(chuàng)建某一種產(chǎn)品對(duì)象類的實(shí)例。工廠方法模式工廠方法模式的本意是將實(shí)際創(chuàng)建對(duì)象的工作推遲到子類中,這樣核心類就變成了抽象類。抽象工廠模式一般用在 1 什么是工廠模式? 工廠模式是用來創(chuàng)建對(duì)象的一種最常用的設(shè)計(jì)模式。我們不暴露創(chuàng)建對(duì)象的具體邏輯,而是將將邏輯封裝在一個(gè)函數(shù)中,那么這個(gè)函數(shù)就可以被視為一個(gè)工廠。工廠模式根據(jù)抽象程度的不...
閱讀 964·2023-04-25 23:54
閱讀 3047·2021-11-08 13:21
閱讀 3775·2021-09-27 13:35
閱讀 3391·2021-07-26 23:41
閱讀 1055·2019-08-30 15:52
閱讀 3439·2019-08-30 11:27
閱讀 2097·2019-08-29 18:37
閱讀 537·2019-08-29 17:24