переопределить .toString () и вернуть как объект - PullRequest
0 голосов
/ 10 августа 2011

возможно ли это в JavaScript?

Что-то вроде:

Response.Cookies = 
        function() {
            return document.cookie;
        };
Response.Cookies.toString = 
        function() {
           Cookies = {};
            this().replace(/([^=]+)=([^;]+);?/g,
                  function(foo, label, value) {
                           return Cookies[label] = value;    
                    });
             return Cookies;
};

alert(Response.Cookies); // "does not work"

Ответы [ 3 ]

2 голосов
/ 10 августа 2011

Это то, что я думаю Вы хотите:

var Response = {};

Response.Cookie = 
        function() {
            var self = this;
            Cookies = {};
            this.Cookies = document.cookie;
            this.Cookies = this.Cookies.replace(/([^=]+)=([^;]+);?/g,
                  function(foo, label, value) {
                       Cookies[label] = value;    
                    });
            this.Cookies = Cookies;
        };
Response.Cookie();
for(var cookie in  Response.Cookies){
    alert(cookie + ' = ' +Response.Cookies[cookie])
}

Fiddle: http://jsfiddle.net/maniator/Yb8NK/


ОБНОВЛЕНИЕ:

Этоверсия без вызова Response.Cookie(): http://jsfiddle.net/maniator/Yb8NK/25/

var Response = {
    Cookies: null
}
Response.Cookie = (function() {
        var self = Response;
        Cookies = {};
        self.Cookies = document.cookie;
        self.Cookies = self.Cookies.replace(/([^=]+)=([^;]+);?/g, 
            function(foo, label, value) {
                 Cookies[label] = value;
            });
        self.Cookies = Cookies;
    })();
for (var cookie in Response.Cookies) {
    alert(cookie + ' = ' + Response.Cookies[cookie])
}

ОБНОВЛЕНИЕ № 2:

Еще лучшая версия:

var Response = {};
Response.Cookies = (function() {
    var cookies = {};
    var doc_cookies = document.cookie;
    doc_cookies = doc_cookies.replace(/([^=]+)=([^;]+);?/g, 
       function(foo, label, value) {
           cookies[label] = value;
       });
    return cookies;
})();
for (var cookie in Response.Cookies) {
    alert(cookie + ' = ' + Response.Cookies[cookie])
}

Fiddle:http://jsfiddle.net/maniator/Yb8NK/29/

1 голос
/ 10 августа 2011

Нет, toString() необходимо вернуть строку, в противном случае неявное преобразование объектов в строки (как это выполняется alert()) просто завершается неудачей. Чего ты пытаешься достичь?

0 голосов
/ 10 августа 2011

Попробуйте вызвать Response.Cookies, а не просто ссылаться на него:

alert(Response.Cookies());
...