2

サンプル コードを次に示します。

f2() 内で f1() を呼び出すと、終了します。理由がわかりません。に置き換えthisてみましTest.prototypeたが、同じように失敗します。読み取りと話した後、私がしたかどうかを尋ね、var foo = new bar()foo で関数を呼び出すと、this常に foo 変数になります。彼の答えは私を混乱させた。

クラス/これはJSでどのように機能しますか? 欲しいのは基本だけ。静的変数と関数は簡単に説明できるかもしれませんが、仮想関数、継承などは必要ありません。パブリック/プライベートがどのように機能するかを知る必要はありませんが、パブリック変数と関数にアクセスする方法を理解できる限り、今のところ問題ありません。

var msg='';
try{

function Test(){
    var a='';
    var b=3;
    var c=4;
    this.f1=function(){
        msg+="f1\n";
    }
    this.f2=function(){
        msg+="f2a\n";
        f1();
        msg+="f2b\n";
    }
    this.f3=function(){
        msg+=b+"\n";
        b=5;
    }
    function f4(){
        c++;
    }
}

var t1 = new Test();
t1.f2();
t1.f3();
t1.f4();
console.log(t1.b);
}
catch(err)
{
    console.log(err);
}
console.log(msg);
4

3 に答える 3

4

他の答えは正しいです:

this.f2=function(){
    msg+="f2a\n";
    f1();
    msg+="f2b\n";
}

に:

this.f2=function(){
    msg+="f2a\n";
    this.f1();
    msg+="f2b\n";
}

どうして:

あなたの用語から、あなたが Java か何かのような異なる言語のバックグラウンドを持っていることがわかります。

まず、いくつかの単純なことを邪魔にならないようにしましょう。

JavaScript にはクラスがありません (まあ、次のバージョンにはありますが、現時点ではそれについて話す必要はありません)。JavaScript では、オブジェクトとプロトタイプ チェーンを使用します。

「これ」は、オブジェクトを含むオブジェクトによって定義されます。

ほぼすべてがオブジェクトです。ほとんどすべてがプリミティブ Object() から継承されます。

console.log( ({}).constructor.prototype ) // Object {}

関数にはプロトタイプがあり、オブジェクトにはプロトタイプを持つコンストラクターがあります。最初は混乱するかもしれません。

console.log( ({}).prototype ) // undefined
console.log( function(){}.prototype ) // Object {}
console.log( (new Function()).prototype ) // Object {}

したがって、非常に基本的な例として、これら 2 つを比較してください。

//eg1
var fn = function(){
   console.log( this ); // window
}

//eg2
var x = {
    fn: function(){
        console.log( this ); // Object {fn: function}
    }
};
x.fn();

ここで、eg1 では、fn() がグローバル スコープのコンテキスト内で定義されていることがわかります。(以下の補足を参照してください)。eg2 では、"this" が包含オブジェクト "x" を参照していることがわかります。

** 補足: ブラウザでは、これは常に「ウィンドウ」です。node.js のような環境では、別のものと呼ばれ、異なるオブジェクトと関数のセットがあります。今は心配しないでください。ブラウザに固執します。

お役に立てれば。

于 2013-03-03T02:36:41.030 に答える
1

13行目を次のように変更するとthis.f1();、完全に機能します!

于 2013-03-03T02:16:13.463 に答える
1

あなたは電話する必要はありthis.f1()ませんf1()

f1はグローバル関数として定義されておらず、オブジェクトのプロパティとして定義されているため、オブジェクトを介して参照する必要があります。

クラスの詳細

クラスが全体的にどのように機能するかについては、JS はプロトタイプの継承を使用します。new 演算子の後に置くと、任意の関数をコンストラクターとして使用できます。new 演算子をthis使用すると、新しく作成されたオブジェクトにバインドされます。したがって、コンストラクター内の this への参照は、新しく作成されたオブジェクトにバインドされます。

したがって、t1オブジェクトには、すべての関数が新しいオブジェクトのメソッドとして自身にアタッチされます。

t1.bb がオブジェクトにアタッチされていないため、何も返されません。コンストラクター内のローカル変数としてのみ定義され、オブジェクトにバインドされることはありませんでした

于 2013-03-03T02:15:46.500 に答える