0

私はバリデータ ライブラリに取り組んでいます。PHP から来て、バリデータと制約を使用してバリデータと同様の設定を行いたいと思います (値、オブジェクトは、選択した制約に対してバリデータによって検証されます)。

したがって、制約に取り組んでいると、次の問題があります。

制約はすべて同じプロパティを共有しますが、実装がわずかに異なります。

例:

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
};

今、どういうわけか Constraint を拡張してカスタマイズしたいと思います:

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

私は2つのことを知りたいと思っています:

  1. 最初に、JavaScript が別の言語であり、これには動的すぎる場合でも、このプログラミング スタイルを使用することをお勧めしますか?
  2. それでも良い方法である場合、上記のような動作をどのように実装できますか? どのようなキーワードを探す必要がありますか?

よろしく

4

2 に答える 2

1

Java、.NET、C++ のバックグラウンドを持っている場合、Javascript は混乱を招く可能性があります。JS にはクラスの概念はなく、すべてが単なる別のオブジェクトです。関数 (クラスをシミュレートするために使用される) でさえ、それ自体がオブジェクトです。以下の記事を見て、ボンネットの下で物事がどのように機能するかを理解してください。

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

Florian が言ったように、継承をシミュレートするには、プロトタイプ ベースのコーディングを使用する必要があります。しかし、個人的には、このスタイルは使用するたびに怪しいと感じました.

一方、OOP の概念としての継承には疑問が残る場合があり、一般的なユースケースのほとんどでアンチパターンとして証明される可能性があります。私のアドバイスは、構成で同じことを達成する方法を探すことです。これは、ほとんどのシナリオでプログラミングのより良いスタイルになる可能性があります。

于 2012-07-13T11:22:46.070 に答える
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!"
于 2012-07-13T10:43:06.720 に答える