以下就是我在學(xué)習(xí)中遇到的問題以及代碼實(shí)例,最后還給大家關(guān)于JS抽象工廠模式的學(xué)習(xí)做了總結(jié)。
抽象工廠模式(Abstract Factory)就是通過類的抽象使得業(yè)務(wù)適用于一個(gè)產(chǎn)品類簇的創(chuàng)建,而不負(fù)責(zé)某一類產(chǎn)品的實(shí)例。
JS中是沒有直接的抽象類的,abstract是個(gè)保留字,但是還沒有實(shí)現(xiàn),因此我們需要在類的方法中拋出錯(cuò)誤來模擬抽象類,如果繼承的子類中沒有覆寫該方法而調(diào)用,就會(huì)拋出錯(cuò)誤。
const Car = function() { } Car.prototype.getPrice = function() {return new Error('抽象方法不能調(diào)用')}
實(shí)現(xiàn)
面向?qū)ο蟮恼Z言里有抽象工廠模式,首先聲明一個(gè)抽象類作為父類,以概括某一類產(chǎn)品所需要的特征,繼承該父類的子類需要實(shí)現(xiàn)父類中聲明的方法而實(shí)現(xiàn)父類中所聲明的功能:
/** * 實(shí)現(xiàn)subType類對(duì)工廠類中的superType類型的抽象類的繼承 * @param subType 要繼承的類 * @param superType 工廠類中的抽象類type */ const VehicleFactory = function(subType, superType) { if (typeof VehicleFactory[superType] === 'function') { function F() { this.type = '車輛' } F.prototype = new VehicleFactory[superType]() subType.constructor = subType subType.prototype = new F() // 因?yàn)樽宇恠ubType不僅需要繼承superType對(duì)應(yīng)的類的原型方法,還要繼承其對(duì)象屬性 } else throw new Error('不存在該抽象類') } VehicleFactory.Car = function() { this.type = 'car' } VehicleFactory.Car.prototype = { getPrice: function() { return new Error('抽象方法不可使用') }, getSpeed: function() { return new Error('抽象方法不可使用') } } const BMW = function(price, speed) { this.price = price this.speed = speed } VehicleFactory(BMW, 'Car') // 繼承Car抽象類 BMW.prototype.getPrice = function() { // 覆寫getPrice方法 console.log(`BWM price is ${this.price}`) } BMW.prototype.getSpeed = function() { console.log(`BWM speed is ${this.speed}`) } const baomai5 = new BMW(30, 99) baomai5.getPrice() // BWM price is 30 baomai5 instanceof VehicleFactory.Car // true
總結(jié)
通過抽象工廠,就可以創(chuàng)建某個(gè)類簇的產(chǎn)品,并且也可以通過instanceof來檢查產(chǎn)品的類別,也具備該類簇所必備的方法。
上面是我整理給大家的,希望今后會(huì)對(duì)大家有幫助。
相關(guān)文章:
動(dòng)態(tài)加載JS文件三種方式總結(jié)
js支持post請(qǐng)求的跨域方法總結(jié)
Vue.js計(jì)算與偵聽器屬性使用詳解
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com