是否有一种方法或属性可以从一个对象中获取所有方法?例如:
function foo() {}
foo.prototype.a = function() {}
foo.prototype.b = function() {}
foo.get_methods(); // returns ['a', 'b'];
更新:jQuery中是否有类似的方法?
谢谢。
Answers:
function getMethods(obj)
{
var res = [];
for(var m in obj) {
if(typeof obj[m] == "function") {
res.push(m)
}
}
return res;
}
for..in
方法是标准的做法。
TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
m instanceof Function
吗?
请记住,从技术上讲javascript对象没有方法。它们具有属性,其中一些可能是函数对象。这意味着您可以枚举对象中的方法,就像枚举属性一样。这(或与此类似的东西)应该工作:
var bar
for (bar in foo)
{
console.log("Foo has property " + bar);
}
这有一些复杂性,因为对象的某些属性不可枚举,因此您将无法找到对象上的每个函数。
在现代浏览器中,您可以Object.getOwnPropertyNames
用来获取对象的所有属性(可枚举和不可枚举)。例如:
function Person ( age, name ) {
this.age = age;
this.name = name;
}
Person.prototype.greet = function () {
return "My name is " + this.name;
};
Person.prototype.age = function () {
this.age = this.age + 1;
};
// ["constructor", "greet", "age"]
Object.getOwnPropertyNames( Person.prototype );
请注意,这只会检索own-properties,因此不会返回原型链其他位置找到的属性。但是,这似乎不是您的要求,因此我认为这种方法已经足够。
如果您只想查看可枚举的属性,则可以使用Object.keys
。这将返回相同的集合,减去不可枚举的constructor
属性。
var methods = [];
for (var key in foo.prototype) {
if (typeof foo.prototype[key] === "function") {
methods.push(key);
}
}
您可以简单地遍历构造函数的原型并提取所有方法。
在Chrome中是keys(foo.prototype)
。返回["a", "b"]
。
请参阅:https://developer.chrome.com/devtools/docs/commandline-api#keysobject
以后编辑:如果需要快速复制(用于较大的对象),请执行此操作copy(keys(foo.prototype))
,并将其保存在剪贴板中。
获取方法名称:
var getMethodNames = function (obj) {
return (Object.getOwnPropertyNames(obj).filter(function (key) {
return obj[key] && (typeof obj[key] === "function");
}));
};
或者,获取方法:
var getMethods = function (obj) {
return (Object.getOwnPropertyNames(obj).filter(function (key) {
return obj[key] && (typeof obj[key] === "function");
})).map(function (key) {
return obj[key];
});
};