1

angular js docsに従って

サービス (名前、コンストラクター); name : name constructor : インスタンス化される注入可能なクラス (コンストラクター関数)。

Internally :
{
  $get: function() {
    return $injector.instantiate(constructor);
  }
}

angular ドキュメントから、サービスは渡された 2 番目の引数をコンストラクターとして扱い、プロバイダーは $injector を介してインスタンスを作成し、$get を介して返すと結論付けることができます。したがって、モジュール関数 (コントローラー、ディレクティブなど) のいずれかにサービスを挿入するときはいつでも、シングルトンのオフコースである新しく作成されたオブジェクトを返す必要があります。

これらの方法でサービスを定義すると、問題が発生します。

1. _app_user_content.service("MyService" , function(){
        this.Message = "Greetings!";
    });  //returns object when injected.
2. _app_user_content.service("MyService" , function(){
        this.Message = "Greetings!";
        return "123"
    }); // returns object  when injected.
3. _app_user_content.service("MyService" , function(){
        this.Message = "Greetings!";
        return function(){}
    }); //returns function(){}  when injected. Doesnot return object

3 番目のケースが関数を返すのはなぜですか?

4

1 に答える 1

2

これは角ばったものではなく、JavaScript のものです。

angularserviceが行うことは、基本的に、2 番目の引数で定義した関数である を実行することにより、関数をコンストラクターとして使用するnew SomeObject()ことSomeObjectです (JavaScript では関数はオブジェクトであることに注意することが重要です)。

関数が何も返さないか、プリミティブ値を返す場合、コンストラクターは戻り値を無視し、代わりにその関数のスコープ (this) に設定したものを返します。ただし、オブジェクトを返す場合、コンストラクターは代わりにそのオブジェクトを返すようです。(ありがとう@ajaykumar)

ブラウザコンソールでこれを試してください...

function potato() {this.yummy = true; return function() {};} 
function tomato() {this.yummy = true;}
console.log(new potato());
console.log(new tomato());

Potato return が表示されるはずfunction () {}です。

tomato return が表示されるはず{yummy: true}です。

このようなコンストラクター関数については、何も返さないことをお勧めします。

ただし、Angular のファクトリnew SomeObject()メソッドを使用する場合は、Angular を実行する代わりreturn SomeObject()に、サービスで公開する関数/パラメーターを含むオブジェクトを返したいことがわかります。

newJavaScriptキーワード、プロトタイプ、コンストラクター関数の詳細については、こちらをご覧ください。

于 2016-05-31T10:14:42.817 に答える