13

私はjavascriptにオブジェクトを持っています:

admins: {
    articles: {
        path: '/admins/articles',
        template: '/views/admins/articles.html',
        link: function() {
            return path;  // !!! how to reference the 'path'?
        }
    }
}

私はこのようなオブジェクトをたくさん持っています、そしてそれらのそれぞれはpathフィールドとlink関数を持っています。pathのフィールドを使用したいのですがlink、だけでは使用できませんpath

私は何をすべきか?

4

5 に答える 5

12

thisオブジェクトを参照するために使用できます。標準object.method()の「ドット」構文は、次の範囲内に設定thisされます。objectmethod

var someObj = {
    admins: {
        articles: {
            path: '/admins/articles',
            template: '/views/admins/articles.html',
            link: function() {
                return this.path; // !!! how to reference the 'path'?
            }
        }
    }
};

var returnedPath = someObj.admins.articles.link();

デモ: http: //jsfiddle.net/2Pt7n/

(適切なオブジェクトに設定されないような関数を呼び出す方法は他にもありますがthis、ここでは適用されないことを願っています-オブジェクトの使用方法や関数の呼び出し方法については実際にはわかりませんが、私が示した方法ではありません。質問を更新してください。それに応じて回答を更新します。)

于 2012-07-20T03:23:00.970 に答える
5

ここではES6ファットアローを使用したくないことを指摘しておきます。その場合、このポインターは存在しないためです。

var someObj = {
    admins: {
        articles: {
            path: '/admins/articles',
            template: '/views/admins/articles.html',
            link: () => {
                return this.path; // 'this' is undefined
            }
        }
    }
};

someObj.admins.articles.link()===未定義

于 2018-02-03T05:27:10.837 に答える
2

これがJSONではないことについては説明しません(他の人はそれをうまくカバーしています)。

パスを取得するためにこれを行うことができます:

return admins.articles.path;

これが機能していることを示すフィドルです:http://jsfiddle.net/UwbLt/

于 2012-07-20T03:12:15.110 に答える
2

表示しているのはJSONではありません。これは、JSONとは異なるJavascriptオブジェクトです。JSONは、厳密に定義されたデータシリアル化形式であり、Javascriptオブジェクトリテラルのサブセットです。

Javascriptは、必要に応じて、オブジェクトリテラル内のピアプロパティを参照するための構文を提供しません。それらに名前を付けることは1つのアイデアですが、リテラルが定義されている間は名前が存在しないため、それは役に立ちません。そのため、リテラル自体で名前を使用することはできません。

また、定義する構文によってオブジェクトが片側になることに注意してください。パスにはとしてアクセスできますobj.admins.articles.pathが、リンクは呼び出す必要のある関数ですobj.admins.articles.link()

于 2012-07-20T03:02:28.953 に答える
1

私は答えを読んでいて、一部のユーザーのポイント(JSONはデータにのみ使用する必要がある)を理解し、これが正しいことに同意して、概念実証の例を作成しました。見てください。

// just a regular object
var obj = {
    a: "aaa",
    b: "bbb",
    c: function() {
        return this.a;
    }
};

console.log( obj.c() ); // prints "aaa"

// isn't it json just because it has a function? ExtJS will treat it like JSON, but jQuery not
var json = "{" +
    "\"a\": \"aaa\", " +
    "\"b\": \"bbb\", " +
    "\"c\": function() {" +
    "    return this.a;" +
    "}" +
"}";

// ok, the "json" above
console.log( json );

//var jsonObj = $.parseJSON( json ); // does not work
//var jsonObj = eval( json ); // does not work too
var jsonObj = Ext.decode( json ); // it works! shortcut for Ext.JSON.decode

console.log( jsonObj.c() );       // prints "aaa"

nnnnnnが投稿したものとほぼ同じですが、答えを補足するために、私も投稿すると思います。jsFiddle: http: //jsfiddle.net/davidbuzatto/rhKAM/

したがって、JSONの定義と矛盾する場合でも、JSONは通常のオブジェクト初期化子sintaxを使用して作成されたオブジェクトと同じ特性を持つことができる(または持つべきである)と思います。その名前は「軽​​量」オブジェクト表記ではなくJavaScriptオブジェクト表記であるためです。 。デシリアライザーはターゲット言語によっては関数をデシリアライズできないことは知っていますが、ExtJSがこの「動作」をサポートしているのはなぜですか?ここで良い議論を見つけることができます:JSON結果で関数を定義することは有効ですか?

明確にするために。JSON内で関数を使用していません(また、使用しません)。

于 2012-07-20T03:30:38.147 に答える