Подтвердить что ты не робот

Как анализировать и перебирать прототипы с помощью Uglify.js?

Я хотел бы проанализировать некоторый код JavasScript, чтобы перечислить все методы для данного "класса", используя uglify js 2. В моем случае TreeWalker возвращает node с name : null, и нет информации, позволяющей делать выводы предок.

Кто-нибудь знает другой подход? Я ожидал чего-то вроде name : "Test.method_name"
До сих пор я пытался использовать следующее...

parsetests.js

var UglifyJS = require("uglify-js2");
var util = require("util");
var code = require("fs").readFileSync("test.js").toString();
var toplevel = UglifyJS.parse(code);
var log = function(obj, depth) {
    console.log(util.inspect(obj, showHidden=false, depth, colorize=true));
};
var toplevel = UglifyJS.parse(code);
var walker = new UglifyJS.TreeWalker(function(node){
    if (node instanceof UglifyJS.AST_Function ) {
        log(node, 2);        
    }
});
toplevel.walk(walker);

test.js

function Test(argument1) {
    var m = argument1 + "test";
    return this;
}


Test.prototype.method_name = function(first_argument) {
    // body...
    return "a";
};

UglifyJS.TreeWalker node:

{ end:
   { file: null,
     comments_before: [],
     nlb: true,
     endpos: 156,
     pos: 155,
     col: 0,
     line: 10,
     value: '}',
     type: 'punc' },
  start:
   { file: null,
     comments_before: [],
     nlb: false,
     endpos: 111,
     pos: 103,
     col: 29,
     line: 7,
     value: 'function',
     type: 'keyword' },
  body:
   [ { end: [Object],
       start: [Object],
       value: [Object] } ],
  cname: undefined,
  enclosed: undefined,
  parent_scope: undefined,
  uses_eval: undefined,
  uses_with: undefined,
  functions: undefined,
  variables: undefined,
  directives: undefined,
  uses_arguments: undefined,
  argnames:
   [ { end: [Object],
       start: [Object],
       thedef: undefined,
       name: 'first_argument',
       scope: undefined,
       init: undefined } ],
  name: null }
4b9b3361

Ответ 1

Я написал script, способный анализировать и идентифицировать этот синтаксис. Я открываю его под https://github.com/s-a/deep-js.

В настоящее время он охватывает множество вариантов использования, описанных в https://github.com/s-a/deep-js/blob/3c1e52b75be197ff19a5530d011e999416e21afd/use-case-main.js. И протестирован с https://github.com/s-a/deep-js/tree/3c1e52b75be197ff19a5530d011e999416e21afd/test. Результаты можно увидеть в https://travis-ci.org/s-a/deep-js/builds/58511486. Текущее состояние текущего кода ограничено. Например, this в настоящее время не может быть разрешен, если используется для другого var, например self. Еще одна проблема связана с глубокими вложенными присваиваниями и пространствами имен. Однако до сих пор он стабилен, если сложность кода не слишком высока.

Ответ 2

В вашем случае функция не имеет имени, ей присваивается свойство, которое имеет имя. Вы должны назвать свою функцию следующим образом:

Test.prototype.method_name = function method_name(first_argument) {
    // body...
    return "a";
};