Javascript document.cookie的代理

Javascript document.cookie的代理,javascript,cookies,proxy,javascript-objects,Javascript,Cookies,Proxy,Javascript Objects,我需要记录document.cookie的设置。我不能仅仅用document.cookie={…}重新定义cookie属性,所以我需要获取document.cookie的setter。但是Object.getOwnPropertyDescriptor(文档,“cookie”)返回未定义的 UPD。在我写这个问题的时候,我找到了一个有效的解决方案,但它使用了不推荐的\uuuuuuuu lookupGetter\uuuuuuuuuu和\uuuuuuu lookupSetter\uuuuuu方法。有没

我需要记录document.cookie的设置。我不能仅仅用
document.cookie={…}
重新定义cookie属性,所以我需要获取document.cookie的setter。但是
Object.getOwnPropertyDescriptor(文档,“cookie”)
返回
未定义的


UPD。在我写这个问题的时候,我找到了一个有效的解决方案,但它使用了不推荐的
\uuuuuuuu lookupGetter\uuuuuuuuuu
\uuuuuuu lookupSetter\uuuuuu
方法。有没有不使用过时API的解决方案?

在我编写问题时,我发现下一个代码解决了我的问题:

var cookie_setter_orig = document.__lookupSetter__("cookie").bind(document);
var cookie_getter_orig = document.__lookupGetter__("cookie").bind(document);
Object.defineProperty(document, "cookie", {
  get: function () {
    return cookie_getter_orig();
  },
  set: function (val) {
    console.log(val);
    cookie_setter_orig(val);
  }
});

但是我不喜欢使用不推荐的方法,所以我希望有更好的解决方案。

访问getter和setter的标准化方法是使用
Object.getOwnPropertyDescriptor
,但顾名思义,它只查看对象自己的属性(不查找原型链)
document
HTMLDocument
的一个实例,它继承自
document
。在现代浏览器中,
cookie
属性是在
Document.prototype
上定义的,而在较早版本的Firefox中,它是在
HTMLDocument.prototype
上定义的

var cookieDesc = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') ||
                 Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie');
if (cookieDesc && cookieDesc.configurable) {
    Object.defineProperty(document, 'cookie', {
        get: function () {
            return cookieDesc.get.call(document);
        },
        set: function (val) {
            console.log(val);
            cookieDesc.set.call(document, val);
        }
    });
}
具有讽刺意味的是,在最关注隐私的浏览器Safari中,描述符已将
可配置
设置为false,并且不包含getter或setter,
\uuuuuuu lookupGetter\uuuuuuuu
\uuu lookupSetter\uuuuuu
。所以我还没有找到在Safari中覆盖
document.cookie
的方法(在OSX和iOS9.0.2上是8.0.8)。WebKit每晚的工作方式与Safari相同,因此它似乎不会很快得到修复


2019年10月更新:在MacOS Mojave上的Safari 12.1.2中测试了上述代码,
cookieDesk
现在可以配置了!这意味着我从2015年开始的工作可能现在就开始了:)

firefox的新版本在
文档中定义了它,就像其他浏览器一样。仍应在答案中保留评论,就像一个标题一样-up@PatrickHollweck谢谢你的提醒!更新了答案以反映Firefox中的变化。