【问题标题】:Function not listed under Object.keys or Object.getOwnPropertyNames but can be invoked未在 Object.keys 或 Object.getOwnPropertyNames 下列出但可以调用的函数
【发布时间】:2016-09-16 03:12:46
【问题描述】:

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

[a,b,c,d]

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

Here,它表示Object.getOwnPropertyNames 也将返回不可枚举的属性。那么像上面的e 这样的属性有什么特点。

我正在使用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 (...){...}

【问题讨论】:

  • 分享可执行演示.. 无法理解问题....
  • 它可能是从它的原型之一继承而来的?如果你这样做:for(prop in obj) { console.log(prop); }(其中 obj 是你的对象),那么它会被输出吗?
  • 添加了一些不可执行的代码,因为您需要自己的 api 密钥。希望这能清楚地解释这个问题

标签: javascript node.js object


【解决方案1】:

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))

然而,这不会给你原型原型的键。

【讨论】:

  • 有没有办法列出对象原型的所有属性。
  • 使用“for in”,因为这将列出对象的所有属性以及由其原型继承的属性。
  • 更新了我的答案。正如@evolutionxbox 所说,您也可以使用for ... in,但如果它是您想要的列表,那么您必须使用for ... in 方法自己构建它。
  • 查看stackoverflow.com/questions/3068534/… 以获得使用for ... in 的良好解决方案
【解决方案2】:

JS 对象的属性可以是

  • own -- 表示直接在对象上定义
  • inherited -- 属性是可调用的,但在原型中定义(Object 的前身)
  • 可枚举/不可枚举——某些属性(如length)不可枚举,您可以使用Object.defineProperty()定义自己的不可枚举属性

然后迭代函数适用于该属性的某些子集:

所以这个函数都不会迭代继承的属性。如果你想迭代所有属性而不解析所有权,那么你需要for... in cycle,比如:

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

但这不会遍历不可枚举的属性。

有关所有权和可枚举性的完整概述see this documentation

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2015-01-06
    • 2021-10-03
    相关资源
    最近更新 更多