piątek, 29 sierpnia 2014

AngularJs - module.service w poszukiwaniu znaczenia i ... operatora new

Witam,

Trochę czasu minęło od ostatniego postu, ale tak się złożyło, że ostatnio miałem naprawdę sporo pracy... Ale dobra, ostatnio poznaję angulara i dzisiaj zastanawiałem się po raz kolejny jaka jest różnica pomiędzy usługą (module.service) a fabryką (module.factory), owszem czytałem na ten temat i najczęściej spotykałem się z wyjaśnieniem, że w przypadku usługi
przekazana funkcja jest konstruktorem z którego przy pomocy operatora new zwrócona zostanie instancja nowego obiektu.

Dla potwierdzenia poniżej przytaczam opis ze styleguida autorstwa Todd Motto( https://github.com/toddmotto/angularjs-styleguide ), który to swoja drogą jest wdrażany w naszej firmie.

All Angular Services are singletons, using .service() or .factory() differs the way Objects are created.

Services: act as a constructor function and are instantiated with the new keyword. Use this for public methods and variables

Factory: Business logic or provider modules, return an Object or closure

Always return a host Object instead of the revealing Module pattern due to the way Object references are bound and updated

Ale dzisiaj przeglądałem kod napisany przez kolegę i tam jego funkcja przekazana do module.service nie wyglądała jak konstruktor, tylko raczej jak funkcja którą można zobaczyć w fabryce.


Oczywiście powyższy kod działa, aczkolwiek funkcja przekazana jako argument do funckji module.service nie jest konstruktorem tylko sama zwraca obiekt jak w fabryce.

Zajrzałem zatem do kodu angulara w poszukiwaniu tego operatora `new`, którego to przytaczają wszędzie. Poniżej widać deklarację funkcji service.


Widać, że usługa jest fabryką zwracającą instancję obiektu utworzoną przez $injectora.istantiate przy użyciu funkcji przekazanej w parametrze constructor. Póki co nie widać operatora new.

Zaglądam zatem do funkcji instantiate obiektu $injector.


Faktycznie jest operator new (w linii 8), tylko zaraz... jest on wykorzystany do utworzenia pustego obiektu i przypisania go do zmiennej instance, a dalej nie widać innego operatora new zatem jak ten obiekt powstał...? A jest jeszcze funkcja invoke, ok sprawdźmy ją (pominąłem w niej fragment operujący na przekazanych argumentach)
Do funkcji invoke przekazywane są trzy parametry: pierwszy w naszym przypadku to funkcja przekazana do metody service, druga natomiast to utworzony pusty obiekt w metodzie instatiate   


Nie ma tu również operatora new, ale jest fajny kawałek kodu  fn.apply(self, args), który powoduje zwrócenie naszego obiektu jeżeli funkcja fn nie jest konstruktorem, natomiast jeżeli funkcja fn jest konstruktorem to z meotdy invoke zostanie zwrócony undefined ?! i nowy obiekt dostępny w zmiennej instance w funkcji instantiate.

Dzisiejsze spostrzeżenia utrwaliły mnie w poczuciu braku zrozumienia różnicy miedzy service a factory oraz jakie jest ich przeznaczenie, dlatego, żeby uniknąć nieporozumień zostaję przy stylu który opisał Todd Motto.
Poznałem również - przynajmniej dla mnie nowy - sposób  na  utworzenie nowego obiektu  przy użyciu dowolnego konstruktora z wykorzystaniem metody .apply(),
dzięki czemu można stworzyć sobie proxy do tworzenia obiektu (to zachowanie fajnie opisuje Ben Nadel w swoim blogu http://www.bennadel.com/blog/2291-invoking-a-native-javascript-constructor-using-call-or-apply.htm).

Warto zajrzeć do kodu źródłowego bo można się zawsze trochę nauczyć :-).
  
  

5 komentarzy:

  1. Needed to compose you a very little word to thank you yet again regarding the nice suggestions you’ve contributed here AngularJS Online Course India

    OdpowiedzUsuń
    Odpowiedzi
    1. Investment plansPROMO PACKAGE ?? BASIC Invest $70 earn $600 Invest $100 earn $1000  Invest $200 earn $2,000  Invest $300 earn $3,500  Invest $400 earn $4,500  Invest $500 earn $6,000 
      ?? PRO  Invest $1,000 earn $15,000  Invest $2,000 earn $25,000  Invest $3,000 earn $35,000  Invest $4,000 earn $45,000  Invest $5,000 earn $60,000  Invest $10,000 earn $100,000. 
      ?? PREMIUM  1BTC earn 5BTC  2BTC earn 10BTC  3BTC earn 16BTC  4BTC earn 22BTC  5BTC earn 30BTC. 
      ALL RETURNS ARE SCHEDULE, FOR 12 HOURS, UPON CONFIRMATION OF PAYMENTS.
      MODE OF PAYMENT. Any, Suitable For Investors, But Terms and Conditions Apply.
      ??HURRY NOW!!! Refer a Friend or Family member to invest same time, and Receive an instant $50 Reward. 
      To set up an INVESTMENT PLAN, Contact Admin: totalinvestmentcompany@gmail.com
      WhatsApp: +1(929)390-8581
      https://www.facebook.com/pg/Total-Investment-221964325813140/about/
      View more on YouTube: https://www.youtube.com/channel/UC3KWT9dTpFLi0S0vJTWuCJg

      Usuń
    2. The development of artificial intelligence (AI) has propelled more programming architects, information scientists, and different experts to investigate the plausibility of a vocation in machine learning. Notwithstanding, a few newcomers will in general spotlight a lot on hypothesis and insufficient on commonsense application. machine learning projects for final year In case you will succeed, you have to begin building machine learning projects in the near future.

      Projects assist you with improving your applied ML skills rapidly while allowing you to investigate an intriguing point. Furthermore, you can include projects into your portfolio, making it simpler to get a vocation, discover cool profession openings, and Final Year Project Centers in Chennai even arrange a more significant compensation.

      Data analytics is the study of dissecting crude data so as to make decisions about that data. Data analytics advances and procedures are generally utilized in business ventures to empower associations to settle on progressively Python Training in Chennai educated business choices. In the present worldwide commercial center, it isn't sufficient to assemble data and do the math; you should realize how to apply that data to genuine situations such that will affect conduct. In the program you will initially gain proficiency with the specialized skills, including R and Python dialects most usually utilized in data analytics programming and usage; Python Training in Chennai at that point center around the commonsense application, in view of genuine business issues in a scope of industry segments, for example, wellbeing, promoting and account.

      The Nodejs Projects Angular Training covers a wide range of topics including Components, Angular Directives, Angular Services, Pipes, security fundamentals, Routing, and Angular programmability. The new Angular TRaining will lay the foundation you need to specialise in Single Page Application developer. Angular Training

      Usuń
  2. I never thought I will come in contact with a real and potential hacker until I knew   brillianthackers800 at Gmail and he delivered a professional job,he is intelligent and understanding to control jobs that comes his way
    Contact him and be happy

    OdpowiedzUsuń
  3. Thanks for sharing this information. I really Like Very Much.
    top angular js online training

    OdpowiedzUsuń