2012-07-13 60 views
0

我正在研究一個來自PHP的驗證器庫我想驗證一個類似的設置與驗證器和約束(值,對象得到驗證器對驗證選定的約束)。Javascript:如何使用「傳統的OOP」

所以工作的限制,我有以下問題:

約束都有着相同的性質只是實現略有不同。

例子:

Constraint = Validator.Constraint = { 
    name: null, // contains the name of the constraint 
    value: null, // contains the value which we want to validate 
    options: {}, // contains options for some Constraints (e.g. range) 
    message: null, // contains the error message which is getting returned 
    validate: function(){}, // the validation logic 
    constructor: function(value, options){ 
     this.value = value; 
     this.options = options; 
     this.validate(); 
    } // the constructor which can be called for stand-alone validation 
}; 

現在我想以某種方式延長約束和定製:

RequiredConstraint = Validator.RequiredConstraint = { 
    name: "required", 
    message: "this property is required", 
    validate: function(){ 
     if (this.value != "" || this.value != undefined || this.value != null) { 
      return; 
     } 
     return this.message; 
    } 
    // other properties get inherited 
}; 

的約束則應該使用具有:

RequiredConstraint(""); 
// returns false 

我知道想知道兩件事:

  1. 首先,如果根本推薦使用這種編程風格,即使JavaScript是另一種語言,並且對此也太動態了?
  2. 如果仍然很好練習,我怎麼能實現上面描述的行爲? 我必須尋找什麼關鍵詞?

問候

+1

我建議學習* JavaScript方法*,即[原型繼承](https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_and_the_prototype_chain)。然後,當你獲得更多的舒適時,瞭解[這些高級模式](http://addyosmani.com/resources/essentialjsdesignpatterns/book/)。對於這種特殊情況,我會說不要重新發明輪子並使用[我自己的插件](http://elclanrs.github.com/jq-idealforms/)來驗證您的表單。 – elclanrs 2012-07-13 10:43:15

回答

1

你需要把你的函數原型,如果你希望他們被繼承。

另外,在ES3中,要繼承的最乾淨的對象是函數。

例子:

function Constraint() {} 

Constraint.prototype = { 
    constructor: Constraint, 

    validate: function() { 
     console.log('Hello!'); 
    }, 

    message: 'Property required!' 
}; 

var RequiredConstraint = new Constraint(); 

RequiredConstraint.message; // "Property required!" 
RequiredConstraint.validate(); // "Hello!" 

// Now let's override it 
RequiredConstraint.validate = function() { 
    console.log('Hey!'); 
}; 
RequiredConstraint.validate(); // "Hey!" 
1

的JavaScript可能會造成混淆,如果你來自一個Java,.NET,C++背景。在JS中沒有類的概念,一切都只是另一個對象。即使是用來模擬類的函數本身也是對象。看看下面的文章,瞭解事情如何在引擎蓋下工作。

https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_Revisited

正如弗洛裏安說,你需要使用基於原型的編碼來模擬繼承。但對我個人而言,這種風格每次使用時都會感到腥意。另一方面,作爲OOP概念的繼承有時是可疑的,並且可能在大多數常見用例中被證明是反模式。我的建議是爲你尋找實現與作曲相同的方法,這對於大多數場景來說可能是更好的編程風格。

+0

嘿,你說得對。Javascript看起來很像傳統OOP背景中的「鍋爐代碼」,我認爲強迫JavaScript進入已知範例並不是一個好主意。我會稍微查看JavaScript設計模式(組合),看看如何讓代碼更具可讀性。我標記florians問題作爲答案堅持嚴格的計算器約定:) – 2012-07-13 13:00:49

+1

@ dev.pus如果你想看到在JS中使用的模式,一個很好的鏈接是這一個:http://javascript.info/tutorial/oop-concepts – 2012-07-13 13:55:06