2016-05-31 3 views
1

В соответствии с угловыми значениями js docsФункция углового Js возвращает функцию/объект?

сервис (имя, конструктор); имя: name constructor: класс инъекции (функция конструктора), который будет создан.

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

Это можно сделать вывод из угловых Документов, что служба обрабатывает 2-й аргумент, передаваемый в качестве конструктора и поставщика создает экземпляр через $ инжектор и возвращается через $ получить. Поэтому всякий раз, когда мы вводим услугу в любую из наших функций модуля (контроллеры, директивы и т. Д.), Он должен вернуть вновь созданный объект, который является Singleton offcourse.

Теперь проблема возникает, если я определяю свое обслуживание такими способами.

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 

Почему третий случай возвращает функцию?

ответ

2

Это вещь JavaScript, более чем угловатая вещь.

Что угловая service делает в основном использовать функцию как конструктор, делая new SomeObject(), SomeObject является функцией вы определили во втором аргументе (важно отметить, что в функции JavaScript являются объектами).

Если ваша функция не возвращает ничего или примитивное значение, конструктор будет игнорировать возвращаемое значение и вместо этого вернет все, что вы указали в области (этой) этой функции. Если, однако, вы возвращаете объект, кажется, что конструктор вернет этот объект. (Спасибо @ajaykumar)

Попробуйте в консоли браузера ...

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

Вы должны увидеть картофельное возвращение function() {}.

Вы должны увидеть возвращение помидора {yummy: true}.

Для таких функций конструктора, как это, я бы рекомендовал ничего не возвращать.

Если же вы использовали factory метод углового, вы обнаружите, что вместо того, чтобы делать new SomeObject() угловые будет делать return SomeObject(), в этом случае вы хотите, чтобы вернуть объект с любыми функциями/параметрами, которые вы хотите, чтобы выставить в службе.

Дополнительная информация о JavaScript new Ключевые слова, прототипы и функции конструктора here.

+1

Ваш ответ правильно указывает на синтаксические основы javascript. Дальнейшее исследование, я могу заключить, что если функция возвращает примитивы javascript, она возвращает вновь созданный объект. Однако, если оператор return включает в себя не примитивные типы, он просто присваивает оператор return и не создает объект. – ajaykumar