-1

だから私は次のような関数を持っているとしましょう:

function Moo()
{
    this.someVal = 'blah';

    return this;
}

Moo.prototype = 
{

}

このクラスからオブジェクトをインスタンス化すると、次のようになります。

var moo = new Moo();

console.log(moo);

someVal を持つオブジェクトではなく、コンソールでこれを取得します

Window www.domain.com
4

1 に答える 1

0

質問を理解できるかどうかはわかりませんが、役立つ説明があります。

プレーンなJavaScript(つまり、ECMAScript)では、関数がnew演算子で呼び出されると、コンストラクターのパブリックオブジェクトに内部セットthisされているかのように作成された新しいオブジェクトを参照します。new Object()[[Prototype]]prototype

return this代わりに他のオブジェクトが返されない限り、返されるのはその新しいオブジェクトです(これは、デフォルトのアクションである必要はありません)。

関数が呼び出されると、その関数はthis呼び出しによって完全に設定され、コンテキスト(つまりスコープ)は関係ありません。

それで:

function Moo() {
  // if called with new, this references a new object
}

// Assign a new object to Moo.prototype,
// replacing the default object given to all functions
Moo.prototype = { 
  someMethod: function() {...},
  ...
} 

// Create an instance of Moo
var moo = new Moo();

// Call a method
moo.someMethod();       

最後の行では、thiswithinはオブジェクトsomeMethodを参照しmooますが、これはメソッドがどのように呼び出されたかに完全に基づいており、メソッドがどのようmooに構築されたか、または呼び出されたコンテキストとは関係ありません。

たとえば、someMethod次のように呼び出された場合:

var x = moo.someMethod;

x();

の値はthis設定されていないため、someMethodデフォルトでグローバル(ウィンドウ)オブジェクトに設定されるか、厳密モードでは未定義になります。

上記は、呼び出しのコンテキストに関係なく発生し、this動的であり、呼び出しによって完全に設定されることに注意してください(ES5バインドを無視します)。

于 2012-09-19T01:15:32.290 に答える