Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中,如果有一个对象有很多属性是函数,如何将它们转换为字符串数组(函数名的数组)?_Javascript_Stringification - Fatal编程技术网

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

在Javascript中,如果有一个对象有很多属性是函数,如何将它们转换为字符串数组(函数名的数组)?,javascript,stringification,Javascript,Stringification,在Javascript中,如果一个对象有许多属于函数的属性: var obj = { foo: function() { ... }, bar: function() { ... }, ... } 那么如何获得这些函数的名称数组呢?即数组 ["foo", "bar", ... ] 谢谢。编辑:我有点误读了这个问题,您只想提取函数对象属性的名称: var names = []; for( var k in obj ) {

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

var obj = { foo: function() { ... },
            bar: function() { ... },
              ...
          }
那么如何获得这些函数的名称数组呢?即数组

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

谢谢。

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

var names = [];
for( var k in obj ) {
   if(obj.hasOwnProperty(k) && typeof obj[k] == 'function') {
      names.push(k);
   }
}
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"]
我正在使用该方法,以确保枚举属性实际上存在于对象中

请注意,此方法和所有其他答案都有一个小问题,即

不使用for in语句枚举在原型链中较高位置隐藏不可枚举属性(
DontEnum
)的自定义属性,例如:

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


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

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

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"]
我正在使用该方法,以确保枚举属性实际上存在于对象中

请注意,此方法和所有其他答案都有一个小问题,即

不使用for in语句枚举在原型链中较高位置隐藏不可枚举属性(
DontEnum
)的自定义属性,例如:

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


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

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

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

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

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

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

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

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

-适用于和的Chrome版本和夜间版本。

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


-致力于Chrome发布和和的夜间构建。

+1用于提及hasOwnProperty,但我相信Jian只是关注功能,而不是所有属性。+1用于提及hasOwnProperty,但我相信Jian只是关注功能,而不是所有属性。有趣,“为什么推送”不会将函数引用推送到数组中,而是将函数名推送到属性名上,而不是实际属性。因此,如果要引用每个属性,可以使用
obj[k]
。因此,如果内部只有一个函数,那么还必须使用“for-in”循环来实现此目的呢?如果“for in”循环不存在,还有其他方法吗?要枚举属性,必须使用
for..in
。没有其他正确的方法。有趣的是,为什么push不会将函数引用推送到数组中,而是将函数名推送到属性名上的in循环中,而不是实际的属性。因此,如果要引用每个属性,可以使用
obj[k]
。因此,如果内部只有一个函数,那么还必须使用“for-in”循环来实现此目的呢?如果“for in”循环不存在,还有其他方法吗?要枚举属性,必须使用
for..in
。没有其他正确的方法。