Aman Gupta Aman Gupta - 6 months ago 14
Node.js Question

Function not listed under Object.keys or Object.getOwnPropertyNames but can be invoked

Suppose there is some library javascript object

jsObj
. On calling
Object.keys
or
Object.getOwnPropertyNames
, I get a list of properties like

[a,b,c,d]


But still I can call a function like
jsObj.e()
. Why the the method
e
is not part of
Object.keys
or
Object.getOwnPropertyNames
? How they are doing it?

Here, it says that
Object.getOwnPropertyNames
will return non enumerable properties too. So what is the characterstic of property like
e
above.

I am using opentok server side SDK. Using following code,

var OpenTok = require('opentok');
var opentok = new OpenTok(config.tokbox.apiKey, config.tokbox.secret);
console.log("opentok1", Object.getOwnPropertyNames(opentok));
prints -> // [ '_client',
'apiKey',
'apiSecret',
'apiUrl',
'startArchive',
'stopArchive',
'getArchive',
'deleteArchive',
'listArchives' ]
console.log("opentok2", opentok.createSession);
prints -> function (...){...}

Answer

Object.e must be defined on the object's prototype. Like this:

var test = function() {}
test.prototype = { e: function() { return 'e'; } }
var obj = new test();
Object.keys(obj) // returns []
obj.e() // returns 'e'

A way of getting the prototypes keys is simply getting the prototype and the use the Object.keys() function:

Object.keys(Object.getPrototypeOf(obj))

This will however not give you keys of the prototypes prototype.

Comments