1

以下のメッセージ オブジェクトで、次のように呼び出すと:

var message_object = new Message( response_element );
message_object.display( 'empty' );

new Message() への呼び出しごとにメッセージ配列が作成されます...その場合、必要なのはメッセージ配列が1つだけであることを確認するにはどうすればよいですか?

var Message = function( element )
{
    var messages =  
    {
        name:         'Please enter a valid name',
        email:        'Please enter a valid email',
        pass:         'Please enter passoword, 6-40 characters',
        url:          'Please enter a valid url',
        title:        'Please enter a valid title',
        tweet:        'Please enter a valid tweet',
        empty:        'Please complete all fields',
        email_s:      'Please enter a valid email.',
        same:         'Please make emails equal',
        taken:        'Sorry, that email is taken',
        validate:     'Please contact <a class="d" href="mailto:chris@domain.com">support</a> to reset your password',
    }
    this.display = function( type ) 
    {
        element.innerHTML = messages[ type ];
        new Effects().fade( element, 'down', 4000 );
    }
};
4

2 に答える 2

3

はい、その関数全体が毎回実行され、メッセージオブジェクトと関数が毎回再定義されます。

おそらくやりたいことは、それをクロージャーでラップし、Javascript のプロトタイプの継承を利用することです

var Message = (function () {
    var messages = {
        name:         'Please enter a valid name',
        email:        'Please enter a valid email',
        pass:         'Please enter passoword, 6-40 characters',
        url:          'Please enter a valid url',
        title:        'Please enter a valid title',
        tweet:        'Please enter a valid tweet',
        empty:        'Please complete all fields',
        email_s:      'Please enter a valid email.',
        same:         'Please make emails equal',
        taken:        'Sorry, that email is taken',
        validate:     'Please contact <a class="d" href="mailto:chris@host.com">support</a> to reset your password',
    };
    var Message = function (element) {
        this.element = element;
    };

    Message.prototype.display = function( type ) {
        this.element.innerHTML = messages[ type ];
        new Effects().fade( this.element, 'down', 4000 );
    };
    return Message;
}());

これにより、messagesオブジェクトは「クラス」に対してプライベートに保たれます。

于 2012-04-10T22:26:22.250 に答える
1

messages配列ではなくオブジェクトですが、そうです。関数を呼び出すたびに新しいオブジェクトが作成されますMessage()

コピーが 1 つだけ必要な場合、他の言語では「静的」変数となるものは次のようになります。

var Message = function( element )
{
    this.display = function( type ) 
    {
        element.innerHTML = this.messages[ type ];
        new Effects().fade( element, 'down', 4000 );
    }
};

Message.prototype.messages = {
    name:         'Please enter a valid name',
    email:        'Please enter a valid email',
    pass:         'Please enter passoword, 6-40 characters',
    url:          'Please enter a valid url',
    title:        'Please enter a valid title',
    tweet:        'Please enter a valid tweet',
    empty:        'Please complete all fields',
    email_s:      'Please enter a valid email.',
    same:         'Please make emails equal',
    taken:        'Sorry, that email is taken',
    validate:     'Please contact <a class="d" href="mailto:chris@host.com">support</a> to reset your password',
};

に追加されたプロパティとメソッドはprototype、すべてのインスタンスからアクセスできます。display()メソッド内では としてアクセスされることに注意してくださいthis.messages

(プロトタイプでもメソッドを定義するのが賢明な場合があることに注意してください。これには、 を使用してパラメーターdisplay()のインスタンス コピーを作成することが含まれます。)elementthis.element = element;

于 2012-04-10T22:24:25.600 に答える