2

私の質問は非常に単純です。

this.さりげなく、オブジェクトにプロパティを定義したら、this.それらを呼び出すときに、追加する必要がないことを偶然発見しました。

つまりthis.、実際には、広告の定義時に使用することを意味しますvar

すぐに自分で見つけたので、これでウィンドウオブジェクトを参照していました。newを使わずにオブジェクトを呼び出したので、関数のように。

おそらくコメントのためのもう1つの質問。メインオブジェクト内で、新しいオブジェクトを作成しthis、オブジェクト定義中に使用すると、これはthis何を参照しますか?

4

5 に答える 5

2

this正しいデータを参照するために使用しなければならないあらゆる状況があります。

これら 2 つの実装は、非常に異なることを行います。

Array.prototype.truncate(newLen) {
    // sets the length property on the current Array object
    this.length = newLen;
}

Array.prototype.truncate(newLen) {
    // sets a global variable named length
    length = newLen;
}

var arr = [1,2,3,4,5,6,7];
arr.truncate(2);

this現在のオブジェクトを変更したい場合に何が起こるかを制御するために使用する必要があります。オフにしておくことができ、現在のオブジェクトのプロパティを変更するという仮定は正しくありません。オフのままにしておくと、メンバー プロパティではなく、グローバル変数を変更することになります。

于 2012-09-02T00:16:17.323 に答える
2

のコンテキストがなどthisグローバルオブジェクトでない限り、いいえwindow。次の例を見てください。

function Foo(bar) {
    this.data = bar;
    console.log(this.data); // OK
    console.log(data); // ReferenceError
}

この例では、 がグローバル変数でない限りReferenceError: data is not defined最初console.log(data)にを取得します。インスタンスのパブリック メンバーにアクセスするには .datathis.data

参考文献:

于 2012-09-02T00:18:07.057 に答える
1

したがって、この。var? のように、実際には広告定義時に使用することを意図していますか?

いいえ、ポイントはthis現在の実行範囲です。を使用しないと、奇妙なエラーが発生する可能性がありますthis。たとえば、あなたがプロパティvalを持つオブジェクトであり、そのオブジェクトのプロトタイプを持っていると想像してください

App.obj = function(){
   this.val = 'initial';
}

obj.prototype.myMethod = function(val) {
   // how would you assign argument val to object val?
}

また、あなたの推論は方法で崩壊することに注意してください。

obj.prototype.meth2 = function(){
   myMethod();  // fails where this.myMethod() would work.
}
于 2012-09-02T00:13:49.840 に答える
1

http://jsfiddle.net/BRsqH/を参照してください。

function f(){
    this.public='hello!';
    var hidden='TOP SECRET!';
}
var instance=new f();
alert('Public data: '+instance.public+ /* gives "hello!" */
    '\nHidden data: '+instance.hidden /* gives undefined */
);

で作成された変数varは隠され、それらを作成した関数の外で表示したり変更したりすることはできません。

ただし、で作成された変数thisは公開されているため、関数の外からアクセスできます。

于 2012-09-02T00:17:42.763 に答える
0

私はそれを手に入れたと思います。

オブジェクトを として定義し、function My_Object(){...}で呼び出しましたMyObject()。このように、My_Object はオブジェクトではなく関数として扱われるため、この == ウィンドウです。

最終的に、My_Object の代わりにプロパティとメソッドを window にアタッチしました。それが、先頭に追加せずに利用できる方法です.this

My_Object をオブジェクトとして初期化する正しい方法は、このように呼び出すことnew My_Objectですよね?

于 2012-09-02T00:16:23.580 に答える