0

重複の可能性:
オブジェクト内の「this」

私が取り組んでいるjQueryプラグインのいくつかのデフォルトオプションのオブジェクトリテラルを作成しようとしています:

  var defaults = {

            r: 5,
            top: this.r,
            bottom: this.r,
            topleft: this.top,
            topright: this.top,
            bottomleft: this.bottom,
            bottomright: this.bottom


        };

私が参照するときdefaults.topそれはundefined

この仕事をするために私にできることは何ですか?それとも別のアプローチですか?オブジェクトリテラルである必要があります。

追加した:

それは(defaultオブジェクト)であり、あなたが見ることができるようにそれがカスケードダウンする方法は、速記のテクニックのようなものであることが意図されていました。たとえば、すべてのコーナーを同じに定義し{r: 5}たい場合はを使用しますが、上部と下部を{top: 5, bottom: 1}再び異なるものにしたい場合は、個別{topleft: 5, topright:2, bottomleft: 3, bottomright:19 }にこれを明確にしないことをお詫びしますが、ご回答いただきありがとうございます。

答え:これは私がやったことです

if(o.topleft == undefined || o.topright == undefined || o.bottomleft == undefined || o.bottomright == undefined){
                if(o.top == undefined || o.bottom == undefined){
                    if(o.r == undefined){
                        o.topleft = 5;
                        o.topright = 5;
                        o.bottomleft = 5;
                        o.bottomright = 5;
                    }else{
                        o.topleft = o.r;
                        o.topright = o.r;
                        o.bottomleft = o.r;
                        o.bottomright = o.r;  
                    }
                }
                else{
                    o.topleft = o.top;
                    o.topright = o.top;
                    o.bottomleft = o.bottom;
                    o.bottomright = o.bottom;
                }
            }

夕食はずさんですが、ちょっとうまくいきました!助けてくれてありがとう!その説明が私にこのようにそれをするように導いたので、私は答えを選びました!

4

1 に答える 1

3

「私が参照するとき、 defaults.top それは undefined

これthisは、作成しているオブジェクトを参照していないためです。これは、thisコードが実行されているスコープからのものです。

オブジェクトリテラル構文では、同じオブジェクト内の他のプロパティを参照して値を設定することはできません。オブジェクトはまだ存在していません。オブジェクトリテラルのに宣言された他の変数または関数を参照できます。したがって、すべてのプロパティを例のように同じにする必要がある場合は、次のようにすることができます。

var val = 5,
    defaults = {
            r: val,
            top: val,
            bottom: val,
            topleft: val,
            topright: val,
            bottomleft: val,
            bottomright: val
    };

または、オブジェクトリテラルを使用していくつかのプロパティを作成し、後で残りを設定します。

var defaults = {
        r : 5
    };

defaults.top = defaults.bottom = defaults.r;
defaults.topleft = defaults.topright = defaults.top;
// etc

明らかに後者は、一部のプロパティを1つの値に設定し、他のプロパティを別の値に設定するのに適しています。(ただし、この例でも、すべてのプロパティは同じです。)

どちらの方法でも、最終的に同じオブジェクトが得られます(オブジェクトリテラルは、オブジェクトを作成するためのショートカット方法にすぎません)。

「私はそれがこのようなことをするのに十分単純であることを望みます $(selector).myPlugin({r:10}); または $(selector).myPlugin({top:10, bottom: 5});

それでも、オブジェクトリテラルをパラメータとしてプラグインを呼び出すことができます。ただし、defaultsオブジェクト(プラグイン内で定義されていると思います)は、他の手法を使用して定義できます。

于 2012-08-12T07:35:09.063 に答える