node-codein icon indicating copy to clipboard operation
node-codein copied to clipboard

Prototype Support

Open joelcarlton opened this issue 10 years ago • 6 comments

Any chance prototype support will be added?

joelcarlton avatar Aug 27 '13 19:08 joelcarlton

Hello there. I'm not sure what do you mean by that.

What is it supposed to do and it's not doing?

Silviu-Marian avatar Aug 27 '13 20:08 Silviu-Marian

I have a class with prototype inheritance and anything within the prototype does now show up in the browser. I discovered I can use object.(prototype) and it will show that particular prototype object.

Under chrome dev tools the object would show up as:

  • object
    • key: value
    • prototype
      • key: value

Under node-codein it looks like this:

  • object
    • key: value

joelcarlton avatar Aug 27 '13 20:08 joelcarlton

Yes, I see what you mean. I'll add support for that in the next few days.

Thanks.

Silviu-Marian avatar Aug 27 '13 21:08 Silviu-Marian

Its a small fix but its working as expected. It does not show prototypes down the chain, which would be awesome, but it is showing them on the directly called object.

    // EXECUTE COMMANDS
    execute: function(q,s){
        var post = '';
        q.on('data', function(c){ post+=c; });
        q.on('end', function(){
            post = require('querystring').parse(post);
            if(typeof(post.command)==='string'){
                var r = {error:false};

                try{
                    r.fnprefix = fnprefix;

                         - r.cnt = eval.apply(global, [post.command]);
                         + var obj = {}
                         + obj = eval.apply(global, [post.command]);
                         + obj.prototype = eval('global.' + post.command + '.constructor.prototype');
                         + r.cnt = obj;

                    r.type = (typeof(r.cnt)==='object' && r.cnt!==null) ?
                        get_constr(r.cnt) :
                        typeof(r.cnt);
                }catch(e){ r.error=e.toString(); }

                s.end(jsencr(r));
            } else if(typeof(post.getsug)==='string'){

                try{ var r = jsencr(dbg.getsug(JSON.parse(post.getsug)));   }
                catch(e){ var r = "[]"; }

                s.writeHead(200, {'Content-type': dbg.mimes['txt'], 'Content-length': r.length});
                s.end(r);
            }else{
                return dbg.serve500(s,'Command was not found');
            }
        });
    },

joelcarlton avatar Aug 27 '13 21:08 joelcarlton

Thanks for the effort.

Don't worry about it, I'll have to add a button for it anyway. The only take is that I'm on vacation, so I can't really test anything right now.

Silviu-Marian avatar Aug 27 '13 21:08 Silviu-Marian

Sorry for the long wait, I saw what you did there, looks like that's not the way to do it. Your implementation throws lots of TypeError: Cannot read property 'constructor' of undefined errors on the basic stuff. My implementation (with regular type checking) doesn't work because the whole thing is being circular.

                try{
                    r.fnprefix = fnprefix;
                    r.cnt = eval.apply(global, [post.command]);

                    // prototype
                    if(typeof(r.cnt)==='object' && r.cnt!==null && 
                        typeof(r.cnt.constructor)!='undefined' && typeof(r.cnt.constructor.prototype)!='undefined'
                    ){
                        r.cnt._prototype = r.cnt.constructor.prototype; 
                    }

                    r.type = (typeof(r.cnt)==='object' && r.cnt!==null) ? 
                        get_constr(r.cnt) : 
                        typeof(r.cnt);
                }catch(e){ r.error=e.toString(); }

This one also doesn't work because prototype members don't seem to be enumerable (?)

                try{
                    r.fnprefix = fnprefix;
                    r.cnt = eval.apply(global, [post.command]);

                    // prototype
                    if(typeof(r.cnt)==='object' && r.cnt!==null && 
                        typeof(r.cnt.constructor)!='undefined' && typeof(r.cnt.constructor.prototype)!='undefined'
                    ){
                        r.cnt._prototype = {};
                        for(var i in r.cnt.constructor.prototype)
                            r.cnt._prototype[i] = r.cnt.constructor.prototype[i];
                    }

                    r.type = (typeof(r.cnt)==='object' && r.cnt!==null) ? 
                        get_constr(r.cnt) : 
                        typeof(r.cnt);
                }catch(e){ r.error=e.toString(); }

Do you have any ideas?

Silviu-Marian avatar Aug 14 '14 22:08 Silviu-Marian