Получить все методы и свойства объекта
Если я использую (на текстовом фрейме):
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 ответа
Когда метод 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/