AngularJS获取工厂对象的实例



有没有办法检查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

看起来工厂/服务的内部AngularJS代码隐藏了原型/构造函数属性。

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

感谢您的帮助!

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

如果您按如下所示进行操作,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.或者,您也可以按如下方式实现。

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

小提琴链接

法典:

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);
  });

最新更新