尝试调用get对象时,Javascript不会抛出错误

问题描述 投票:0回答:2

我正在尝试使用AngularJS来实现一项服务来管理cookie。

angular
    .module('myModule')
    .service('CookiesService', ['$cookies', function ($cookies) {

        var cookies = {
            cookie1: {},
            cookie2: {}
        };

        function CookiesService() {
        }

        CookiesService.prototype.update= function(name, options) {
            cookies[name] = options ? options : {};
        };


        CookiesService.prototype.isCookie = function(name) {
            if(!cookies.hasOwnProperty(name)) {
                throw 'Unknown cookie name';
            }
            return cookies.hasOwnProperty(name);
        };

        function getter(prototype, name, getter) {
            Object.defineProperty(prototype, name, {
                get:getter, 
                enumerable: true,
                configurable: true,
            });
         }

         Object.keys(cookies).forEach(function(name) {
             getter(CookiesService.prototype, name, function() {
                 try {
                      CookiesService.prototype.isCookie(name);
                      return $cookies.get(name);
                  } catch (e) {
                      throw new Error('Invalid cookie'); // never thrown!
                  }
             });

             /*Setter code*/


             return new CookiesService();
         });
     }
]);

所以基本上,如果我想在设置后检索cookie,我只需要调用CookiesServices。

但是,如果我尝试调用getter来检索不存在的cookie,我希望在控制台中出现错误。因为我有抛出,但它似乎无法正常工作,我无法调试并查看代码是否在此级别执行。

示例:CookiesService.cookie3 < - 给我未定义,没有抛出错误。

还假设我做如下:

CookiesService.prototype.isCookie = function(name) {
return cookies.hasOwnProperty(name);
};

Object.keys(cookies).forEach(function(name) {
getter(CookiesService.prototype, name, function() {
 if (!CookiesService.prototype.isCookie(name)) {
    throw new Error("blabla");
}
  return $cookies.get(name);
});

如果我尝试调用CookiesService.cookie2,它不会抛出blabla错误

javascript angularjs getter-setter
2个回答
1
投票

首先,将function getter(){}重命名为function createGetter(){}可能是个好主意。这将使事情更容易理解,特别是在所述函数的最后一个参数上也称为“getter”。

其次,你说:

Howe [v]呃,如果我试图调用getter来检索不存在的cookie ...

这根本不会发生:记住你的foreach循环正在为现有的cookie(在var cookies下定义的东西)创建getter。在cookies下,服务对象上永远不会有一个getter,它也没有相应的值;因此,做像CookiesService.cookie3这样的事情根本就不是一个吸气剂。

如果你考虑一下,你怎么能期望运用代码(例如,get: function(){...})用于从未被定义的吸气剂?

所以调用CookiesService.cookie3将永远不会执行您为现有cookie设置的代码,因此永远不会破坏您的错误抛出。

你所看到的'undefined'错误是JS从字面上告诉你它不是一个函数,它不是一个getter,它不是一个属性......它不是在对象CookiesService上定义的任何东西。


0
投票

您只需检查undefined而不是等待错误。在JavaScript中,您可以访问未定义的值。只要您不尝试访问未定义的值,就不会出现错误

Object.keys(cookies).forEach(function(name) {
getter(CookiesService.prototype, name, function() {
  CookiesService.prototype.isCookie(name);
  if ($cookies.get(name) !== undefined) return $cookies.get(name)
  else throw new Error('Invalid cookie');
});
© www.soinside.com 2019 - 2024. All rights reserved.