2015-09-05 77 views
1

我需要记录document.cookie的设置。我不能用document.cookie = {...}重新定义cookie属性所以我需要为document.cookie获取setter。但是Object.getOwnPropertyDescriptor(document, "cookie")返回undefineddocument.cookie的代理

UPD。当我写这个问题时,我发现了一个工作解决方案,但它使用了不推荐的__lookupGetter____lookupSetter__方法。有没有不使用过时的API的解决方案?

回答

3

访问getter和setter的标准化方式是Object.getOwnPropertyDescriptor,但顾名思义,它仅查看对象自己的属性(它不查找原型链)。 documentHTMLDocument的一个实例,它从Document继承。在Chrome,Safari,Opera和IE中,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浏览器,描述符已设置configurable和不包含的getter也不二传手,而且也不__lookupGetter____lookupSetter__。所以我还没有找到一种方法来在Safari中覆盖document.cookie(OS X和iOS 9.0.2上的8.0.8)。 WebKit每晚的行为与Safari相同,所以它似乎不会很快得到修复。

0

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

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

,但我不喜欢使用过时的方法,所以我希望有一个更好的解决方案。