【问题标题】:How to inject javascript code to the beginning of every prototype method?如何在每个原型方法的开头注入 javascript 代码?
【发布时间】:2013-07-06 12:22:28
【问题描述】:

出于调试目的,我想在 javascript 中的 每个 方法原型中注入 javascript 代码。这个例子只显示了一个类,但假设我有数百个类,每个类有几十个方法。这种机制应该在原型级别执行,而不需要指定每个类/方法名称。

function MyClass1() {
    this.attrib = "ABC";
}

MyClass1.prototype.myMethod = function() {
   alert("first row");  // <---- THE INJECTION SHOULD OCCUR BEFORE THIS LINE OF CODE
}

这个想法是在第一次加载/执行 javascript 代码期间动态在 myMethod() 的第一行之前注入一些代码。如:

MyClass1.prototype.myMethod = function() {
   alert("I was injected dynamically");
   alert("first row");
}

因此,对于其他所有类和方法,也应该发生同样的情况。这可以使用 Function.prototype 方法实现吗?

【问题讨论】:

  • 我希望您不打算使用 alert 显示调试信息。请改用console.logconsole.debug(如果支持)。
  • 即使console.log 也不能依赖。除非已打开开发者工具,否则它会使 Internet Explorer 崩溃。
  • 我使用“alert”只是为了进行这次调查。我计划执行的调试基于特定的控制全局对象。
  • 关于重复,我正在尝试为所有类和所有方法动态执行此操作。我确保我的问题更清楚地说明了这一点。谢谢

标签: javascript


【解决方案1】:

只需包装您的方法。这是标准方法:

MyClass1.prototype.myMethod = function() {
    alert("first row");
}

然后包装它:

var orig = MyClass1.prototype.myMethod;
MyClass1.prototype.myMethod = function() {
    alert('Injected');
    return orig.apply(this, arguments);
}

您问了两个问题,而我只回答了其中一个(即如何包装函数)。另一部分 - 如何在许多功能上执行此操作 - 最好使用专门的库来完成。事实上,这可以使用Aspect Oriented Programming (AOP) 来完成。我发现了几个提供此功能的 JavaScript 库,其中一个是 Aop.js(您可以自己尝试谷歌搜索)。

【讨论】:

  • 不是orig = MyClass1.prototype;,也许你的意思是var orig = MyClass1.prototype.myMethod;
猜你喜欢
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2011-07-13
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多