如何在Javascript中检查此对象可用的对象和方法

mko*_*mko 3 javascript

嘿,我是JavaScript的新手,我喜欢MyClass.classMyClass.methodsRuby,在JavaScript中是否有任何等价来检查可用的对象类型和方法?

BTW typeof操作员似乎总是回来'object',我不知道为什么.

ale*_*lex 5

在JavaScript中是否有任何等价来检查对象类型..

typeof运营商这样做,但它可以与它报告回混乱.

例如,typeof null会告诉你'object',虽然它不是一个对象(虽然这个行为是定义的).

typeof 'a'会告诉你'string',但typeof new String('a')会告诉你一个'object'.

typeof运算符的另一个优点是,ReferenceError如果尚未声明其操作数,它将不会抛出.

下面用于确定函数的方法可以适用于报告正确的类型(尽管typeof通常对于基元来说足够).

......和方法可用吗?

您可以使用for ( in )循环查看对象上的所有属性.

for (var prop in obj) {
   console.log(prop);
}
Run Code Online (Sandbox Code Playgroud)

这将显示所有可枚举的属性,包括继承/委托的属性.要忽略继承的属性,请将其添加到循环体中...

if ( ! obj.hasOwnProperty(prop)) {
   continue;
}
Run Code Online (Sandbox Code Playgroud)

要查看方法(分配了函数的属性),您可以执行此操作...

for (var prop in obj) {
    if (!obj.hasOwnProperty(prop) || Object.prototype.toString.call(obj[prop]) != '[object Function]') {
        continue;
    }
   console.log(prop, obj[prop]);
}
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

如果不是在多window环境中(即不是iframes),你可以简单地使用......

for (var prop in obj) {
    if (!obj.hasOwnProperty(prop) || ! (obj[prop] instanceof Function)) {
        continue;
    }
   console.log(prop, obj[prop]);
}
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

...要么...

for (var prop in obj) {
    if (!obj.hasOwnProperty(prop) || obj[prop].constructor != Function) {
        continue;
    }
   console.log(prop, obj[prop]);
}
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

如果您只关心实现的方法[[Call]](即可以作为函数调用),例如RegExp较旧的Safaris中对象,您可以简单地确定可以调用的内容typeof fn == 'function'.

既然你提到了Ruby,你可能会完全疯狂并实现Ruby class(或足够接近)并methods通过扩充Object.prototype,但请不要.:)

我还在typeofJavaScript中有关于运算符的深入文章.