0

リファクタリングしているタグ付けプラグインがあります。

毎回作成するオブジェクトを渡し続けるので、代わりに値を渡す関数があり、オブジェクトを返します。プラグインの変数の1つにアクセスする必要がある場合を除いて、これは正常に機能します。

下部を見ると、内部が表示されます。_addTag私はに呼び出しをthis.tag行い、要素の数を格納したいのですtagArrayが、への呼び出しではウィジェットが呼び出されthisません。

(function ($) {
    $.widget("ui.tagit", {

        // default options
        options:{},

        //initialization function
        _create:function () {

            var self = this;
            this.tagsArray = [];
            ...

            ...
            this._addTag('label', 'value');

            }

        },


        _addTag:function (label, value) {
            ...

            //THIS IS WHERE THE TAG OBJECT IS CREATED
            var tag = new this.tag(label, (value === undefined ? label : value));
            tag.element = $('<li class="tagit-choice"'
                + (value !== undefined ? ' tagValue="' + value + '"' : '')
                + '>' + label + '<a class="tagit-close">x</a></li>');
            ...
        },

        tag: function (label, value, element) {
            var self = this;
            return {
                label:label,
                value:value,
                element:element,
                index: self.tagsArray.length
            }
        }

    });
})(jQuery);

this代わりに、への呼び出しは次のとおりです。

$.widget.tag
__proto__: Object
constructor: function (label, value, element) {
__proto__: Object
4

1 に答える 1

1

JavaScriptでキーワードを使用しnewて関数を呼び出すと、そのコンテキスト(this)が新しく作成されたオブジェクトに設定されて呼び出されます。

関数内の例では、操作しているウィジェットオブジェクトに設定されることtagを期待していますが、キーワードthisを使用しているため、代わりに新しく作成されたオブジェクトに設定されます。newしたがって、self.tagsArray.length新しく作成されたオブジェクトにはプロパティがないため、失敗しtagsArrayます。

キーワードの詳細についてはnew、MDNの記事(https://developer.mozilla.org/en/JavaScript/Reference/Operators/new )を読むことをお勧めします。

于 2012-05-05T11:10:17.180 に答える