Angularjs 的 Factory 和 Service 的区别

阅读时长 5 分钟读完

作为前端开发人员,我们经常使用 AngularJS 这个流行的 JavaScript 框架来构建 Web 应用。在 AngularJS 中,有两种主要的特殊对象,Factory 和 Service。这两种对象都是用来创建可重用的构造方法,但它们在功能和实现上有不同点。

Factory

Factory 允许我们定义一个返回对象的函数。你可以在应用的各个部分引用这个函数,并在需要时调用它来获取一个新的实例。Factory 可以用于从服务器获取数据,然后将其转换为包含数据的对象。

下面是一个简单的示例,展示如何使用 Factory:

-- -------------------- ---- -------
------------------------ ---------- -
    --- --------- - ---
    --------------------- - ---------- -
        ------ ------- --------
    --
    ------ ----------
---

------------------------------ ---------------- ---------- -
    --------------- - ------------------------
---

在上面的例子中,我们定义了一个名为 “myFactory” 的 Factory,它返回一个包含 getGreeting 函数的对象。在我们的控制器中,我们使用 Dependency Injection(依赖注入)的方式,将 myFactory 作为参数传递给了我们的控制器函数。然后我们在控制器中定义了一个 $scope.greeting 变量,它等于 myFactory.getGreeting() 的返回值。

Service

Service 可以与 Factory 混淆,因为它们都可以用来创建可重用的构造方法。但是它们的不同之处在于,Service 是一个通过构造函数创建的单例对象。

下面是一个简单的示例,展示如何使用 Service:

-- -------------------- ---- -------
------------------------ ---------- -
    ---------------- - ---------- -
        ------ ------- --------
    --
---

------------------------------ ---------------- ---------- -
    --------------- - ------------------------
---

在上面的例子中,我们定义了一个名为 “myService” 的 Service。与 Factory 不同,Service 在它的构造函数中使用了 this 关键字来定义对象的行为,而不是将对象定义为私有变量。在我们的控制器中,我们再次使用 Dependency Injection(依赖注入)的方式,将 myService 作为参数传递给了我们的控制器函数。然后我们在控制器中定义了一个 $scope.greeting 变量,它等于 myService.getGreeting() 的返回值。

差别

尽管 Factory 和 Service 的效果相似,但它们在应用中有着不同的使用场景。

  • Factory 更具灵活性,因为它可以返回任何类型的对象。同时,由于可以使用不同的依赖注入方法,可以简单地进行 stubbing 和 mocking。
  • Service 更适合用于创建单例对象,并且更符合「面向对象编程」的思想。如果你需要共享数据或状态,或者只想创建一个实例并在你的应用中全局使用,那么 Service 是一个不错的选择。

总结

Factory 和 Service 都是创建可重用模块的有用工具。Factory 更具灵活性,而 Service 更适合用于创建单例对象。你可以根据你的应用程序的需求来选择它们中的任何一个。

示例代码

以下是一个应用 Factory 和 Service 的示例应用代码:

-- -------------------- ---- -------
---- -------------- -----------------------------
    ----------- ---------
    --------------------------

    ----------- ---------
    --------------------------
------
--------
--- --- - ----------------------- ----

------------------------ ---------- -
    --- --------- - ---
    --------------------- - ---------- -
        ------ ------- ----- ----- -----------
    --
    ------ ----------
---

------------------------ ---------- -
    ---------------- - ---------- -
        ------ ------- ----- ----- -----------
    --
---

------------------------------ ---------------- ---------- ---------- -
    ---------------------- - ------------------------
    ---------------------- - ------------------------
---
---------

在上面的示例中,我们定义了一个名为 “myApp” 的 ng-app,它引用了一个名为 “myController”的控制器。在我们的控制器中,我们使用 myFactorymyService 服务对象获取了两个不同的问候语,并且分别将它们分别绑定到我们的 $scope 对象上。最后,我们在 HTML 中使用了绑定表达式来显示这两个变量。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64530f49968c7c53b0780f0f

纠错
反馈