3

私のアプリケーションは、変更できないサードパーティの外部JavaScriptファイルにアクセスしています。

ファイル内には、次のように定義されたオブジェクトがあります。

object_1 = (function(){
    var object_1_var = 'object_1_var_value';
    return {
        obj_1_func: function() {
            console.log(object_1_var);
        }
    }
})(window);

object_1_varオブジェクト内にアクセスできる必要がありますが、アクセスに苦労しています。

object_1.v // returns undefined
object_1.obj_1_func() // returns the value via console, but I need to assign it to a var.

次のようにオブジェクトを拡張してみました:(jQuerys $ .extend()を使用)

object_2 = (function(){
    return {
        obj_2_func: function() {
            return object_1_var;
        }
    }
})(window);

$.extend(object_1, object_2);

var my_var = object_1.obj_2_func(); // returns 'Uncaught ReferenceError: object_1_var is not defined'

アクセスできるようにするにはどうすればよいobject_1_varですか?

4

5 に答える 5

4

変数にアクセスできなくなります。たまたまプライベートメンバーです。オブジェクトのプライベートメンバーには、そのメンバー関数からのみアクセスできます。

これを読んでください。

于 2012-10-10T22:08:38.613 に答える
3

次のように公開します。

object_1 = (function(){
 var object_1_var = 'object_1_var_value';
 return {
    obj_1_func: function() {
        console.log(object_1_var);
    },
    object_1_var: object_1_var
 }
})(window);

編集

object_1_varJavaScriptを編集できない場合(サードパーティのライブラリなど-省略して申し訳ありません)、そのスコープはクロージャーに対してローカルであるため、アクセスできませんobject_1

于 2012-10-10T22:10:03.893 に答える
3

object_1_var字句スコープのローカル変数です。

つまりobject_1、元の定義の外に拡張してアクセスすることはできません。

アクセスできる唯一の方法は、宣言された元の字句スコープ内に関数を追加することです。

object_1 = (function(){
    var object_1_var = 'object_1_var_value';
    return {
        obj_1_func: function() {
            console.log(object_1_var);
        }
        var_1: function(x) {
            if (typeof x !== 'undefined') {
                object_1_var = x;
            } else {
                return object_1_var;
            }
        }
    }
})(window);

しかし、あなたは修正することができないのでobject_1、あなたは運が悪いので、私は恐れています!

于 2012-10-10T22:13:22.163 に答える
2

残念ながら、この例ではobject_1_varにアクセスできません。変数は、その特定の関数内でローカルとして定義されています。他の関数がそれを認識できる唯一の理由は、それらもその関数内で定義されているためです。この「クロージャスコープ」は、JavaScriptの興味深い機能であり、他の場所ではあまり見られませんが、JavaScriptオブジェクトで「プライベート」変数を定義する唯一の実際の方法です。

お役に立てば幸いです。


最悪のシナリオでは、過去に、他の場所(主にGreasemonkeyスクリプト)で以前に定義されたオブジェクトの定義を効果的に上書きすることでこの種の問題を回避しましたが、本番環境での使用にはこれを容認しません!

ここでの秘訣は、スクリプト全体を自分のスクリプトにコピーすることです。それは地獄のように醜いです、しかしそれはうまくいくかもしれません!(YMMV)

于 2012-10-10T22:10:47.407 に答える
2

あなたが達成しようとしていることはJSでは不可能です。

object_1の構築により、変数はそのメソッドのスコープ外になります。ロギング関数が変数にアクセスできる理由は、「クロージャ」と呼ばれるものです。

于 2012-10-10T22:12:20.287 に答える