Angular的工厂和服务的区别是什么?

    • Angularのファクトリとサービスの違い

 

    javascirptの new 演算子の有無に着目したオブジェクト生成

Angular中工厂和服务的区别

我将解释Angular1系中工厂和服务的区别。在以下代码中,我们在所属项目中发现了这样的东西。这主要是为项目成员准备的文章,但也可能对其他人有用。

首先声明一下。本文中所提到的代码未经过验证。

angular
  .module('hoge')
  .factory('hogeFactory', function(){
    function func1 (){}
    function func2 (){}
    function func3 (){}
    return {
      func1: function(){
        return func1();
      },
      func2: function(){
        return func2();
      },
      func3: function(){
        return func3();
      },
    };
  });

这样一来,函数调用就会浪费一次。

function functionName (){}

写下来,

var functionName = function(){}

一样的。

根据下面的代码,可以进行修正。

angular
  .module('hoge')
  .factory('hogeFactory', function(){
    function func1 (){}
    function func2 (){}
    function func3 (){}
    return {
      func1: func1,
      func2: func2,
      func3: func3,
    };
  });

使用该服务时,可以按照以下方式书写。

angular
  .module('hoge')
  .service('hogeService', function(){
    this.func1 = function(){}:
    this.func2 = function(){}:
    this.func3 = function(){}:
  });

关注于javascript中使用new运算符与否的对象生成。

在JavaScript中,有一种习惯是将以使用new运算符为前提的函数名称的首字母大写,本文也会遵循这一习惯。Person函数是一个使用new的函数,而person函数是一个不使用new的函数。

function Person(name, age){
  this.name = name;
  this.age = age;
  this.introduce = function(){ console.log(this.name + 'です。' +  this.age + '才です。'); };
  this.jump = function(){ console.log('ぴょーん'); };
  this.eat = function(){ console.log('ぱっくん'); };
}

var taro = new Person('太郎', 10);
taro.introduce();
taro.eat();
taro.jump();

本文旨在解释Angular中的服务和工厂。每次使用new操作符创建Person实例时,都会生成introduce、jump和eat函数对象,这不是一个好的例子。然而,由于Angular的服务是单例的,在解释上可能不太合适,但我们在这里将其说明如下。

function person(name, age){
  var object = {};
  object.name = name;
  object.age = age;
  object.introduce = function(){ console.log(this.name + 'です。' +  this.age + '才です。'); };
  object.jump = function(){ console.log('ぴょーん'); };
  object.eat = function(){ console.log('ぱっくん'); };
  return object;
}

var taro = person('太郎', 10);
taro.introduce();
taro.eat();
taro.jump();

再稍微改变一下,

function person(name, age){
  function introduce(){ console.log(this.name + 'です。' +  this.age + '才です。'); },
  function jump(){ console.log('ぴょーん'); },
  function eat(){ console.log('ぱっくん'); },

  return {
    name: name,
    age: age,
    introduce: introduce,
    jump: jump,
    eat: eat
  };

var taro = person('太郎', 10);
taro.introduce();
taro.eat();
taro.jump();

这里有两个版本,一个是使用new运算符的版本,另一个是不使用new运算符的版本,它们正好对应于Angular中服务和工厂的关系。

angular
  .module('hoge')
  .service('hogeService', function(){
    this.func1 = function(){}:
    this.func2 = function(){}:
    this.func3 = function(){}:
  })
  .factory('hogeFactory', function(){
    function func1 (){}
    function func2 (){}
    function func3 (){}
    return {
      func1: func1,
      func2: func2,
      func3: func3,
    };
  })
;

换句话说,Angular的服务在注入时使用new运算符,而工厂不使用new运算符。并且,尽管在一般的JavaScript程序中,重复创建同一个函数对象被认为是糟糕的编码方式,但Angular的服务和工厂是单例的,所以没有问题。如果不了解这些内容,就需要学习JavaScript中的原型。

广告
将在 10 秒后关闭
bannerAds