首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用Uglify.js解析和迭代原型方法?

如何用Uglify.js解析和迭代原型方法?
EN

Stack Overflow用户
提问于 2015-04-07 09:39:03
回答 2查看 684关注 0票数 12

我想使用uglify js 2解析一些JavasScript代码来列出给定“类”的所有方法。在我的示例中,TreeWalker返回一个带有name : null的节点,并且没有允许父节点得出结论的信息。

有谁知道不同的方法吗?我期待着像name : "Test.method_name"这样的东西

到目前为止我试着翻翻..。

parsetests.js

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
function Test(argument1) {
    var m = argument1 + "test";
    return this;
}


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

UglifyJS.TreeWalker节点:

代码语言:javascript
运行
复制
{ 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 }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-14 22:23:36

我编写了一个能够解析和识别这些语法的脚本。我是在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 )上使用,self目前无法解决。深度嵌套赋值和名称空间是另一个问题。但是,到目前为止,如果代码复杂度不太高的话,它是稳定的。

票数 5
EN

Stack Overflow用户

发布于 2015-04-14 14:39:43

在您的示例中,函数没有名称,而是分配给具有名称的属性。必须将您的功能命名如下:

代码语言:javascript
运行
复制
Test.prototype.method_name = function method_name(first_argument) {
    // body...
    return "a";
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29488449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档