5

私はそのようなコードを持っています:

User = function(){}

User.a = function(){
  return "try";    
}

User.b = function(){

}

User.b() から、次を使用して User.a() を呼び出すことができます。

User.b = function(){
    return User.a();
    }

これは user のインスタンスではないため、使用しません (User.a() と User.b() は「静的メソッド」のようなものです)。

私がやりたいことは、User.b() から User.a() を呼び出すことができるようにすることです。この場合は User.

このようなものは、静的メソッドで使用されます。

4

4 に答える 4

10

実際には、js にはメソッドや静的メソッドはなく、オブジェクト プロパティに割り当てられた関数 (関数もオブジェクトです) だけがあり、それらはすべて同じように機能します。のように呼んでいるので、 がUser.b()通話thisUserになります。

User.b = function() {
    return this.a();
}
于 2012-06-28T16:33:56.947 に答える
7

関数のコンテキストを決定する唯一のものは、それをどのように呼び出すかです。

プレーン識別子(関数名、変数、またはプロパティ)を使用して呼び出す場合、コンテキストはグローバルwindowオブジェクトになります。

someFunction();

ピリオドを使用してオブジェクトメンバーにアクセスする場合、コンテキストはオブジェクトになります。

someObject.someFunction();

メンバーをオブジェクトから変数にコピーすると、オブジェクトへの接続はなくなり、windowコンテキストとして呼び出されます。

var x = someObject.someFunction;
x();

関数をプロパティとしてオブジェクトに割り当て、そのオブジェクトを使用して呼び出すと、コンテキストはオブジェクトになります。

someObject.x = someFunction;
someObject.x();

特定のケースでUserは、は関数であり、これもオブジェクトです。

を使用して関数を呼び出すとUser.b、そのコンテキストはUserオブジェクトになります。この場合は、たまたま関数になります。関数内からthis、コンテキストにアクセスするために引き続き使用できます。

User.b = function(){
  return this.a();
}
于 2012-06-28T17:02:19.037 に答える
0

JavaScriptには通常の継承がありません。私はあなたがこのようなことをしようとしていると思います:

User = function(){
    this.a= function(){
         return 'try';
    }
    this.b= function(){
        return this.a();
    }
}

このようにして User はコンストラクターになります。User の新しいインスタンスはそれぞれ、これらのメソッドにアクセスできます。したがって、User クラスの新しいインスタンスを作成する場合は、new キーワードを使用できます。

var client= new User()

そして、クライアントを使用してユーザーからすべてのメソッドにアクセスできます

client.b() //returns 'try'
于 2012-06-28T16:37:21.093 に答える
0

関数はコンテナー オブジェクトとは独立して存在します。それらは単なる値です。したがって、それらをオブジェクトのメソッドとして呼び出していない場合this、それらは呼び出しコンテキストにあるものをすべて継承します。その場合、彼らがコンテナについて知っていることを期待することUser.xは、値 1 を割り当ててから、数値 1 が何らかの形で について知っていることを期待することと同じUserです。

ただし、User.a()orを呼び出すUser.b()とき、実際にはそれらをメソッド (関数オブジェクト) のメソッドとして呼び出していますUserthisは と同じでUser、コールbするだけで準備this.a()完了です。

于 2012-06-28T16:44:58.920 に答える