Получить все методы и свойства объекта

Если я использую (на текстовом фрейме):

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 ответа

Пытаться obj.reflect.methods чтобы получить все методы

Когда метод 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() на одном из этих способов это не перечисляемое и не СОБСТВЕННОЕ свойство объекта 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( /*...*/ );

Для завершения: допустим, вы нашли .fit на прототипе объекта prot, Тогда вы можете проверить это:

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

Это выводит объект, который показывает значение prot.fit и является ли это перечисляемым, записываемым и настраиваемым или нет. Object.methods и еще несколько НАЙДИТЕ ЗДЕСЬ.

Или просто использовать b.inspect(obj), Распечатывает все свойства и значения объекта рекурсивным способом на консоль. Смотрите http://basiljs.ch/reference/

Другие вопросы по тегам