AngularJS 获取工厂对象的实例

AngularJS get instance of factory object

有没有办法检查 AngularJS 工厂创建的对象实例?

angular.module('so')
    .factory('UserFac', function () {
        return function (first, last) {
             return {
                 name : first + ' ' + last
             };
        }
    })
    .controller('UserCtrl', function (User) {
        var user = new UserFac('John', 'Doe');

        function isUser(userObj) {
            // your answer here...
        }

        if (isUser(user)) {
            // does not matter
        }
    });

不幸的是,我发现无法通过通常的 JavaScript 方式检查工厂对象的实例,例如:

user instanceof UserFac

typeof user === 'UserFac'

user.constructor === UserFac

user.prototype === UserFac

看起来 factories/services 的内部 AngularJS 代码隐藏了 prototype/constructor 属性。

网络搜索非常痛苦,因为(大部分)所有结果都涉及服务和工厂之间的区别。

感谢您的帮助!

一个问题是您的构造函数是匿名的,另一个问题是您返回的是对象文字(它不是构造函数的实例,而是对象构造函数的实例) 来自你的构造函数。

instanceof 将正常工作,如果你这样做如下所示:

angular.module('so', []);
angular.module('so')
  .factory('UserFac', function() {
    function UserFac(first, last) {
     //--------^-- give it the factory name
      this.name = first + ' ' + last
     //-^-- use the object created internally using this keyword
    }
    return UserFac;
  })
  .controller('UserCtrl', function(UserFac) {
    var user = new UserFac('John', 'Doe');
    console.log(user instanceof UserFac)
  });

同意@T.J。或者你也可以按下面的方式实现。

您可以阅读他们的 documentation 实际上 Angular 实例化命名提供程序的方式。这是 Angular 社区本身定义的最佳实践。

Fiddle Link

代码:

angular.module('so', []);
angular.module('so')
  .factory('UserFac', function UserFac() {
   return function (first, last) {
      this.name = first + ' ' + last
    }
  })
  .controller('UserCtrl', function(UserFac) {
    var user = new UserFac('John', 'Doe');
    console.log(user instanceof UserFac)
    console.log("Name:"+user.name);
  });