函数不在Object.keys或Object.getOwnPropertyNames下列出,但可以调用

假设有一些库javascript对象jsObj 。 在调用Object.keysObject.getOwnPropertyNames ,我得到了一个属性列表

 [a,b,c,d] 

但是我仍然可以调用像jsObj.e()这样的函数。 为什么方法e不是Object.keysObject.getOwnPropertyNames一部分? 他们是怎么做的?

在这里 ,它说Object.getOwnPropertyNames也会返回非枚举属性。 那么像上面那样的财产的特征是什么?

我正在使用opentok服务器端SDK。 使用下面的代码,

 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 (...){...} 

Object.e必须在对象的原型上定义。 喜欢这个:

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

获取原型键的一种方法是获取原型并使用Object.keys()函数:

 Object.keys(Object.getPrototypeOf(obj)) 

这将不会给你原型原型的关键。

一个JS Object的可能性可能是

  • 自己 – 意味着它直接定义在对象上
  • inheritance – 该属性是可调用的,但在原型中定义(Object前身)
  • enumerable / not enumerable – 一些属性(如length )不是可枚举的,你可以用Object.defineProperty()定义你自己的非枚举属性

然后迭代函数在这个属性的一些子集上工作:

  • Object.keys() – 返回给定对象自己可枚举属性的数组
  • Object.getOwnPropertyNames – 返回直接在给定对象上find的所有属性(可枚举或不可)的数组

所以这个函数没有迭代inheritance的属性。 如果你想迭代所有的财产没有所有权的解决,那么你需要for... in cycle ,如:

 var keys = []; for (var key in object) keys.push(key); 

但是这不会遍历非枚举属性。

有关所有权和可枚举的完整概述, 请参阅此文档 。