0

あるサイトのユーザースクリプトを書いています。関数内の内部変数にアクセスする必要があります。たとえば、次のコードでは、オブジェクト c の「プライベート プロパティ」b にアクセスする必要があります。

function a(){
    var b;
    //assignment to b and other stuff
};
var c=new a();

サイトのコードを変更することはできません。BORWSER EXTENSION SCRIPTISHを変更してUSERSCRIPTを書き込むことしかできません。私のブラウザは最新のfirefoxです。Scriptishを変更しなければならない場合でも、アクセスする必要があります。

4

3 に答える 3

1

関数の内部変数にアクセスすることはできません。外部から取得するには、グローバル変数にする必要があります。

var b;
function a(){
 b=1;
    //assignment to b and other stuff
};
var c=new a();
document.write(c.b);

出力は 1 になります。

于 2013-03-02T20:35:11.863 に答える
0

あなたのコードbはプライベート変数ではなく、ローカル変数です。そして実行後var c=new a();b はもう存在しません。したがって、アクセスすることはできません。

しかし、クロージャーを使用すると、すべてが変わります:

function a(){
    var b;
    //assignment to b and other stuff
    this.revealB = function() {
        return b;
    }
};
var c = new a();
alert(c.revealB());

bこれはまだローカル変数ですが、その有効期間はクロージャの影響を受けるため、 を呼び出してもまだ生きていますrevealB

于 2013-03-02T20:35:51.987 に答える
0

実行するのは非常に簡単で、継承アプリケーションに最適です。

あなたは単にあなたが望むものを返すだけで、おそらくメソッドを介してそれを返し、後で他の関数で再利用して構築します。

例は次のとおりです。

    function a(){
        var b;
        //assignment to b and other stuff
        return b;
      };

     // or

   function a(){
        var b, result;
        //assignment to b and other stuff
        returnInitial: function() {
           return b;
         }
        // other stuff with b
        return result;
   };

後で、いわゆる「寄生継承」を使用し、すべてのローカル変数を使用して他の関数内でこの関数全体を開始し、次のように新しいメソッドを追加できます。

var a function() {
        var b, result;
        //assignment to b and other stuff
        returnInitial: function() {
           return b;
         }
        // other stuff with b
        return result;
}
var extendedA function() {
    var base = new a;
    var b = a.returnInitial();
    a.addToB = function (c) {
    var sum = c + a.returnInitial();
    return sum;
    }
}

だからあなたは今得ることができます

var smt = new extendA();
var c = 12; //some number
var sumBC = extendA.addToB(c);

これらの優れたプラクティスについては、js オブジェクトの処理に関する doug crockford の講義を ytube で検索することをお勧めします。

新しいインスタンスを初期化しないと、javascript が使用する動的オブジェクト処理によって元のオブジェクトがクラッシュする可能性があるため、new を使用する必要があることに注意してください。

于 2013-03-02T21:18:58.020 に答える