2015-06-06 14 views
1

Я пытаюсь переопределить document.cookie, так как мне нужно управлять файлом cookie , но кажется, что getOwnPropertyDescriptor, наложенное на document.cookie, не извлекает его получателя и сеттера (проверено на chrome и firefox). Может ли кто-нибудь объяснить мне такое поведение?Получение документа.cookie getter и setter

https://jsfiddle.net/1363ktwp/7/

var obj={}; 
 

 
// creating a property using document.cookie descriptors 
 
Object.defineProperty(
 
    obj, 
 
    "oldCookie", 
 
    Object.getOwnPropertyDescriptor(document, "cookie") 
 
); 
 
    
 
// setting cookies succesfully 
 
document.cookie="test1=ok;path=/;expires=365;"; 
 
document.cookie="test2=ok;path=/;expires=365;"; 
 

 
alert(document.cookie); 
 

 
Object.defineProperty(document, "cookie", { 
 
    get: function() { 
 
     return obj.oldCookie; 
 
    }, 
 
    set: function (cookie) { 
 
     /* 
 
      ...preliminar operations 
 
     */ 
 
     
 
     obj.oldCookie = cookie; 
 
    } 
 
}); 
 
    
 
// obj.oldCookie is just a string without getter/setter 
 
// so assignments below doesn't works correctly 
 
document.cookie="test3=ok;path=/;expires=365;"; 
 
document.cookie="test4=ok;path=/;expires=365;"; 
 

 
alert(document.cookie);

ответ

1

Может кто-нибудь объяснить мне это поведение?

document.cookie является собственностью host object. Объекты-хосты часто не являются объектами JavaScript (native objects) и не требуются и не гарантируются наличие объектов JavaScript.

Я был бы действительно потрясен, если бы многие или даже более одного или двух браузеров реализовали document.cookie с использованием утилизаторов/сеттеров ES5. Возможно, для некоторых новых API (или, возможно, нет), но для одного из них это будет очень много. (я также должен думать долго о разветвлениях безопасности ...)

Если они ли реализовать с помощью ES5 геттеров/сеттеров, это не удивило бы меня, если они сделали его неконфигурируемое свойство (например, чтобы вы не могли его изменить).

+0

спасибо за объяснения! Я пытаюсь решить проблему, вызванную законом ЕС по печенью. Для этого требуется управлять всеми типами файлов cookie, создаваемых сайтом, но нет возможности отключить/управлять ими, не изменяя конкретный код, который его создает (в контексте, когда у вас есть платформа, заполненная сторонними плагинами, которые не должны быть измененный становится очень тяжелым). Именно поэтому я искал «глобальное» решение. – Joseph

+1

@ Джозеф: Да. Последние рекомендации по этому поводу, насколько я знаю (и я не юрист [и даже если был, я не являюсь вашим * адвокатом]) заключается в том, что с политикой cookie и ссылкой на нее с целевой страницы вероятно, достаточно, и что в сочетании с простым баннером уведомлений (который пользователь может убрать - предпочтение, которое вы можете сохранить в cookie, забавно, но лучше хранить в 'localStorage'), достаточно много. Подробнее: https://econsultancy.com/blog/63118-17-useful-examples-of-eu-cookie-law-compliance/ –

2

Вы можете использовать методы __lookupSetter__ и __lookupGetter__, но предупреждайте, что они устарели и не поддерживаются везде. Они работают правильно в Chrome, Firefox, IE11. Не работайте в IE < 10. Opera предоставляет такие методы, но их шов всегда возвращает undefined. Не проверял ничего другого.

Вот пример:

var cookieSetterOrig = document.__lookupSetter__("cookie"); 
var cookieGetterOrig = document.__lookupGetter__("cookie"); 
Object.defineProperty(document, "cookie", { 
    get: function() { 
     return cookieGetterOrig.apply(document); 
    }, 
    set: function() { 
     return cookieSetterOrig.apply(document, arguments); 
    }, 
    configurable: true 
});