2015-05-20 37 views
0

研究員程序員, 對於這個嚴重問題的問題感到抱歉,但我是編程新手,這是我無法弄清楚的作業的一部分。在任務的條件是這樣的..如何在每次調用其他方法之一時在JavaScript中爲類引發密碼確認方法?

我代表筆記本的抽象類 - AbstractNotebook,它具有類似的方法:

-addTextToPage(); 
-deleteTextFromPage(); 
-read();... 

我想從一個類繼承到表示一類ProtectedNotebook,與AbstractNotebook類中的所有內容相同,只是它有一個密碼,它是通過創建一個新實例來定義的,實際的東西我不知道該怎麼做:

每次調用方法時在ProtectedNotebook類的實例中,首先我必須讓用戶爲該實例編寫密碼然後實際的方法可以繼續。

//我的抽象類是:

function AbstractNotepad() { 
    if (this.constructor.name == 'AbstractNotepad') { 
     throw new Error('This class is abstract and cannot be instanciated'); 
    } 
} 

AbstractNotepad.prototype.getPages = function() { 
    return this.pages; 
}; 

AbstractNotepad.prototype.insertPage = function(page) { 
    if(page instanceof Page){ 
     this.pages.push(page); 
    } 
}; 
AbstractNotepad.prototype.getPageNumber = function() { 
    return getPages()[pageNumber - 1]; 
}; 
AbstractNotepad.prototype.addTextToPage = function(pageNumber, textToAdd) { 
    this.getPageNumber().setText(this.getPageNumber().getText() + ' ' + textToAdd); 
}; 

AbstractNotepad.prototype.swapTextInPage = function(pageNumber, text) { 
    this.getPageNumber().deleteText(); 
    this.getPageNumber().setText(text); 
}; 

AbstractNotepad.prototype.deleteTextFromPage = function(pageNumber) { 
    this.getPageNumber().deleteText(); 
}; 

AbstractNotepad.prototype.readNotebook = function() { 
    for (var i = 0; i < this.getPages().length; i++) { 
     console.log((i + 1) + '\n' + this.getPages()[i].read()) 
    } 
} 

//實際ProtectedNotebook類是目前的樣子:

var moduleSecure = (function(){ 
    function SecuredNotepad (pass) { 
     this.pages = []; 
     var password = pass; 
     this.getPass=function(){ //obviously left for debugging purposes 
      return password; 
     } 

    } 
    SecuredNotepad.prototype = Object.create(AbstractNotepad.prototype); 
    SecuredNotepad.prototype.constructor = SecuredNotepad; 

    return { 
     createNotebook: function(pass){ 
      var reg = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{5,}/; 

      if(!reg.test(pass)){ 
       throw new Error('password is not valid'); 
      } 
      return new SecuredNotepad(pass); 
     } 
    } 

})(); 

這是actualy可能嗎?或者我必須完全覆蓋所有的方法,只是爲他們添加了配置部分? Thak你提前! Kristian

回答

0

您可以通過循環遍歷常規筆記本原型中的函數並將它們包裝在密碼驗證函數中來創建安全筆記本對象。

這裏有一個密碼,包裝原型:

function pwdProtect(validator, successFunc, failFunc) { 
    return function() { 
    if (validator()) { 
     return successFunc.apply(null, arguments); 
    } else { 
     return failFunc.apply(null, arguments); 
    } 
    } 
} 

它採用三個參數,一個驗證器函數將返回true或false和一對函數,對一個成功運行,失敗一次運行。它返回一個函數。傳遞給包裝器的任何參數都會依次傳遞給包裝函數(成功或失敗,無論哪個被觸發)。

function SecureNotebook() { 
    for (var attr in Notebook.prototype) { 
    if (Notebook.prototype.hasOwnProperty(attr)) { 
     if (typeof Notebook.prototype[attr] == 'function') { 
     this[attr] = pwdProtect(pwdPlaceHolder, Notebook.prototype[attr], alwaysFalse); 
     } else { 
     this[attr] = Notebook.prototype[attr]; 
     } 
    } 
    } 
} 

下面是SecureNotebook構造函數的函數。它克隆了常規Notebook原型的屬性,如果它們是函數,則將它們包裝在pwdProtect中進行驗證和保護。我在示例中傳遞的函數只是簡單的佔位符。

看到jsfiddle這裏:http://jsfiddle.net/5utguu1j/

+0

謝謝你的答案,託德!我需要一點時間才能掌握這個概念(我自己從來不會這麼做),但是我已經設法實現它。乾杯! –

相關問題