Javascript没有';尝试调用对象上的get时不会抛出错误
我正在尝试使用AngularJS实现一个服务来管理cookieJavascript没有';尝试调用对象上的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()
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');
});