获取对象的所有方法和属性

时间:2014-11-12 11:26:56

标签: javascript adobe-indesign basil.js

如果我使用(在文本框架上):

b.selection().fit(FitOptions.frameToContent);

然后它按预期工作,这意味着所选对象具有拟合方法。

如果我使用:

for (var property in b.selection()) {
    b.println(property);
}

在相同的选择上,它不会打印拟合方法。

如果我使用它:

function getMethods(obj) {
  var result = [];
  for (var id in obj) {
    try {
      if (typeof(obj[id]) == "function") {
        result.push(id + ": " + obj[id].toString());
      }
    } catch (err) {
      result.push(id + ": inaccessible");
    }
  }
  return result;
}


b.println(getMethods(b.selection()));

然后我也没有得到合适的方法。我真的想知道所选对象的所有方法和属性。那我怎么得到它们呢?

3 个答案:

答案 0 :(得分:1)

如果方法fit()存在且未在for-in-loop中显示,则不可枚举属性。

有多种方法可以访问对象的属性:

var obj = b.selection();
for (var p in obj) {
    console.log(p); // --> all enumerable properties of obj AND its prototype
}
Object.keys(obj).forEach(function(p) {
    console.log(p); // --> all enumerable OWN properties of obj, NOT of its prototype
});
Object.getOwnPropertyNames(obj).forEach(function(p) {
    console.log(p); // all enumerable AND non-enumerable OWN properties of obj, NOT of its prototype
});

如果您没有通过其中一种方式找到.fit()不可枚举不是OWN 属性的obj,而是位于obj的原型然后你可以这样做:

var prot = Object.getPrototypeOf(obj);
Object.getOwnPropertyNames(prot).forEach(function(pp) {
    console.log(pp); // --> all enumerable AND non-enumerable properties of obj's prototype
});

对象通常有一点原型链,而且属性位于更深处。然后,您只需根据需要重复最后一个片段:

var prot2 = Object.getPrototypeOf(prot);
Object.getOwnPropertyNames(prot2).forEach( /*...*/ );

要完成它:假设您在obj的原型.fit上找到prot。然后你可以检查它:

console.log(Object.getOwnPropertyDescriptor(prot.fit));

输出一个对象,显示prot.fit以及它是否可枚举,可写和可配置。 Object.methods以及更多FIND HERE

答案 1 :(得分:1)

或者只使用b.inspect(obj)。以递归方式将对象的所有属性和值打印到控制台。见http://basiljs.ch/reference/#inspect

答案 2 :(得分:1)

尝试obj.reflect.methods获取所有方法