Jack
Jack

Reputation: 16724

override .toString() and return as object

is it possible in JavaScript?

Something like:

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"

Upvotes: 0

Views: 598

Answers (3)

Naftali
Naftali

Reputation: 146302

This is what i think you want:

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/


UPDATE:

This is a version without ever calling the 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])
}

UPDATE #2:

Even better version:

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/

Upvotes: 2

Wladimir Palant
Wladimir Palant

Reputation: 57651

No, toString() needs to return a string, otherwise the implicit conversion of objects to strings (as it is being performed by alert()) simply fails. What are you trying to achieve?

Upvotes: 1

circusbred
circusbred

Reputation: 1240

Try invoking Response.Cookies, rather than just referencing it:

alert(Response.Cookies());

Upvotes: 0

Related Questions