函数不在Object.keys或Object.getOwnPropertyNames下列出,但可以调用
假设有一些库javascript对象jsObj
。 在调用Object.keys
或Object.getOwnPropertyNames
,我得到了一个属性列表
[a,b,c,d]
但是我仍然可以调用像jsObj.e()
这样的函数。 为什么方法e
不是Object.keys
或Object.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);
但是这不会遍历非枚举属性。
有关所有权和可枚举的完整概述, 请参阅此文档 。