Convert object to JSON omitting certain (private) properties

I've been using dean edwards base.js (http://dean.edwards.name/weblog/2006/03/base/) to organise my program into objects ( base.js is amazing btw, if you havent used it before !).Anyway, my question is generic and you don't have to know base.js to know my answer.

I have a property in one of my objects called ref which is a reference to a DOM element, and this object is meant to be saved as JSON using JSON.stringify, but as you can imagine since DOM elements are circular structure, I won't be able to convert the object into JSON.

Now to get around this problem I have a method called html() which is meant to return the ref property, but I need to have ref as a private property which is only accessible from within the object, and hence won't be sent to stringify.

What's the best way to do that?

Answers:

Answer

You probably know that you cannot have private properties in JavaScript.

Interestingly, if you pass an object to JSON.stringify which has a method toJSON, JSON.stringify will automatically call that method to get a JSONable representation of that object. So all you have to do is implement this method.

For example you can create a shallow copy of the object which only contains the properties you want to copy:

MyConstructor.prototype.toJSON = function() {
    var copy = {},
        exclude = {ref: 1};
    for (var prop in this) {
        if (!exclude[prop]) {
            copy[prop] = this[prop];
        }
    }
    return copy;
};

DEMO

Another way would be to use a custom replacer function, but it might be more difficult to control which ref to exclude and which one to keep (if different objects have ref properties):

JSON.stringify(someInstance, function(key, value) {
     if(key !== 'ref') {
         return value;
     }
});

DEMO

Answer

here is sample to to set variable visibility

function Obj(){
       this.ref = 'public property'; // this property is public from within the object

       var ref = 'private proerty'; // this property is private.

       var self = this;

        this.showRef = function(){
            alert(ref);
            alert(self.ref);
        };
    }

var obj = new Obj();
obj.showRef();

Tags

Recent Questions

Top Questions

Home Tags Terms of Service Privacy Policy DMCA Contact Us Javascript

©2020 All rights reserved.