2015-09-05 21 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); 
    } 
}); 

,但我不喜歡使用過時的方法,所以我希望有一個更好的解決方案。