Javascript没有';尝试调用对象上的get时不会抛出错误

Javascript没有';尝试调用对象上的get时不会抛出错误,javascript,angularjs,getter-setter,Javascript,Angularjs,Getter Setter,我正在尝试使用AngularJS实现一个服务来管理cookie angular .module('myModule') .service('CookiesService', ['$cookies', function ($cookies) { var cookies = { cookie1: {}, cookie2: {} }; function CookiesService()

我正在尝试使用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之后检索它,我只需要调用CookieServices

但是,如果我试图调用getter来检索一个不存在的cookie,我希望在控制台中得到一个错误。因为我有抛出,但它似乎不工作,我无法调试和查看代码是否在这个级别执行


示例:CookiesService.cookie3您可以只检查未定义,而不必等待错误。是的,在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');
});

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

第二,你说:

但是,如果我试图调用getter来检索一个不存在的cookie

这根本不会发生: 请记住,您的
foreach
循环正在为现有的cookies(在
var cookies
下定义的内容)创建getter。在您的服务对象上定义的getter永远不会在
cookies
下没有相应的值;因此,像
CookieService.cookie3
这样的操作根本不需要调用getter

如果您仔细想想,您怎么能期望为一个从未定义过的getter执行代码(例如,
get:function(){…})

因此,调用
CookieService.cookie3
将永远不会执行为现有Cookie设置的代码,因此也永远不会中断错误抛出


您看到的“undefined”错误实际上是JS告诉您它不是函数,不是getter,也不是属性。。。它不是在对象
CookiesService

上定义的任何东西,这不是我在代码中所做的事情的目的。如果您注意到了,您将看到我的代码中有预定义的cookie名称。我在这里检查我在get函数调用中提供的cookie名称是否已经存在于cookies对象中。因此,如果我使用CookieService.cookie1,这可能会给我一个值或未定义的值,而不会出现问题。但是,CookieService.cookie3应该会向我抛出一个错误,并且不是未定义的。我不想使用cookies对象中未定义的cookie名称调用$cookies.get()。您
返回新的CookieService()来自
forEach
回调(这没有意义),而不是来自
服务
回调。这是你的实际代码吗?顺便说一句,如果你只实例化一个单例,你不应该使用类/构造函数。尤其是当它甚至没有属性或状态时。只需使用对象文字即可。@Bergi您能解释一下为什么“不应该”吗?我的意思是,这样做会出什么问题呢?它过于复杂,效率低下,让读者感到困惑。没有注意到cookie3没有getter,因此代码不会被执行。我真的在等那个解释。谢谢您,很抱歉输入错误;)
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');
});