【问题标题】:AngularJS get instance of factory objectAngularJS 获取工厂对象的实例
【发布时间】:2016-03-21 08:00:07
【问题描述】:

有没有办法检查由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 代码隐藏了原型/构造函数属性。

网络搜索非常痛苦,因为(大部分)所有结果都处理服务和工厂之间的差异。

感谢您的帮助!

【问题讨论】:

    标签: javascript angularjs prototype instanceof typeof


    【解决方案1】:

    一个问题是您的构造函数是匿名的,另一个问题是您从你的构造函数。

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

    【讨论】:

    • 就是这样!非常感谢您的快速回复。看起来不一定需要构造函数的名称,重点是“this”的用法。以下代码也可以解决问题: angular.module('so', []); angular.module('so') .factory('UserFac', function() { return (first, last) { this.name = first + ' ' + last; //-^-- 使用内部创建的对象 this关键字}; });
    【解决方案2】:

    同意@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);
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多