在Javascript中,如果有一个对象具有很多函数属性,如何将它们转换为字符串数组(函数名称)?

发布于 2024-09-05 15:34:16 字数 261 浏览 8 评论 0原文

在 Javascript 中,如果一个对象有很多函数属性:

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          }

那么如何获得这些函数的名称数组呢?也就是说,一个数组,

["foo", "bar", ... ]

谢谢。

In Javascript, if an object has lots of properties that are functions:

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          }

then how can you get an array of names of those functions? That is, an array

["foo", "bar", ... ]

thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

べ繥欢鉨o。 2024-09-12 15:34:16
var names = [];
for( var k in obj ) {
   if(obj.hasOwnProperty(k) && typeof obj[k] == 'function') {
      names.push(k);
   }
}
var names = [];
for( var k in obj ) {
   if(obj.hasOwnProperty(k) && typeof obj[k] == 'function') {
      names.push(k);
   }
}
屋顶上的小猫咪 2024-09-12 15:34:16
var functions = [];
for (var prop in obj) {
    if ((typeof obj[prop]) == 'function') {
        // it's a function
        functions.push(prop);
    }
}
var functions = [];
for (var prop in obj) {
    if ((typeof obj[prop]) == 'function') {
        // it's a function
        functions.push(prop);
    }
}
咽泪装欢 2024-09-12 15:34:16

编辑:我稍微误读了这个问题,您只想提取作为函数对象的属性的名称:

function methods(obj) {
  var result = [];
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop) && typeof obj[prop] == 'function') {
      result.push(prop);
    }
  }
  return result;
}

var obj = {
  foo: function() { },
  bar: function() { },
};

methods(obj); // ["foo", "bar"]

我正在使用hasOwnProperty方法,保证枚举的属性事实上物理上存在于物体中。

请注意,这种方法和所有其他答案都有一个小问题 IE。

JScript 的 DontEnum Bug,隐藏不可枚举属性的自定义属性 (DontEnum)原型链中较高的部分,不使用 for-in 语句进行枚举,例如:

var foo = {
  constructor : function() { return 0; },
  toString : function() { return "1"; },
  valueOf : function() { return 2; }
  toLocaleString : function() { return "3"; }
};

for (var propName in foo ) { alert(propName); }

对象 foo 明确定义了四个自己的属性,但这些属性存在于 Object 中.prototype 标记为 DontEnum,如果您尝试在 IE 中使用 for-in 语句枚举该对象的属性,它将找不到任何属性。

此错误存在于所有 IE 版本中,最近已在 IE9 平台预览版中修复。

Edit: I've slightly misread the question, you want to extract the names of only the properties that are function objects:

function methods(obj) {
  var result = [];
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop) && typeof obj[prop] == 'function') {
      result.push(prop);
    }
  }
  return result;
}

var obj = {
  foo: function() { },
  bar: function() { },
};

methods(obj); // ["foo", "bar"]

I'm using the hasOwnProperty method, to ensure that the enumerated properties in fact exist physically in the object.

Note that this approach and all other answers have a small problem IE.

The JScript's DontEnum Bug, custom properties that shadow non-enumerable properties (DontEnum) higher in the prototype chain, are not enumerated using the for-in statement, for example :

var foo = {
  constructor : function() { return 0; },
  toString : function() { return "1"; },
  valueOf : function() { return 2; }
  toLocaleString : function() { return "3"; }
};

for (var propName in foo ) { alert(propName); }

The object foo clearly has defined four own properties, but those properties exist in Object.prototype marked as DontEnum, if you try to enumerate the properties of that object with the for-in statement in IE, it won't find any.

This bug is present on all IE versions, and has been recently fixed in IE9 Platform Preview.

辞别 2024-09-12 15:34:16

要完成其他答案:您还可以使用 instanceof

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          },
    fnArr = [];

for (var label in obj){
  if (obj[label] instanceof Function){
     fnArr.push(label)
  }
}

To complete other answers: you can also use instanceof:

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          },
    fnArr = [];

for (var label in obj){
  if (obj[label] instanceof Function){
     fnArr.push(label)
  }
}
静若繁花 2024-09-12 15:34:16

使用 ES5

var obj = {
    foo: function() {},
    bar: function() {},
    baz: true
};

function getMethods(object) {
    return Object.keys(object).filter(function(key) {
        return typeof object[key] == 'function';
    });
}

getMethods(obj); // [foo, bar]

Object.keys()< /code> 以数组形式返回对象的所有可枚举属性的名称,其中非函数被过滤掉。

示例 - 适用于 Chrome 版本和 WebkitTracemonkey (Firefox)

With ES5:

var obj = {
    foo: function() {},
    bar: function() {},
    baz: true
};

function getMethods(object) {
    return Object.keys(object).filter(function(key) {
        return typeof object[key] == 'function';
    });
}

getMethods(obj); // [foo, bar]

Object.keys(<object>) returns the names of all enumerable properties of an object as an array, of which the non-functions are filtered out.

Example - works on Chrome release and nightly builds of Webkit and Tracemonkey (Firefox).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文