因此,我编写了这段代码来帮助我在其他函数之前或之后添加函数,但是我想不出更好的方法来做到这一点,我不得不使用eval(),这实际上不是一个好习惯。 一开始,我试图做类似的事情:

Function.prototype.append = function(fn){
    eval("this = function(){ ("+this.toString()+").apply(this, arguments); fn.apply(this, arguments); }");
}

hello = function(){
    console.log("hello world!");
}

hello(); // hello world!
hello.append(function(){
    console.log("bye world!");
});
hello(); // hello world! bye world

但由于该功能无法更改,因此无法正常工作。 所以我做到了:

Aspects = new Object();

Aspects.append = function(aspect, fn){
    eval(aspect + " = function(){ ("+eval(aspect + '.toString()')+").apply(this, arguments); fn.apply(this, arguments); }");
}

Aspects.prepend = function(aspect, fn){
    eval(aspect + " = function(){ fn.apply(this, arguments); ("+eval(aspect + '.toString()')+").apply(this, arguments); }");
}

hello = function(){
    console.log("hello world!");
}

hello(); // hello world!

Aspects.append('hello', function(){
    console.log("bye world!");
});

hello(); // hello world! bye world!

我不想使用对象或任何东西,我只想在已经声明的函数之后或之前添加更多代码

===============>>#1 票数:0 已采纳

我有一个名为fcombine的实用程序库,它支持

f1 = fcombine.pre(new_function, f1);
f1 = fcombine.post(f1, new_function);

您的代码丑陋的原因是因为您没有返回新函数。

您的代码的问题还在于它使用eval并试图做太多的魔术。 传入一个变量名字符串然后进行评估的整个想法是绝对可怕的。

你可以很容易地写

hello = Aspects.append(hello, new_function);

fcombine.post

===============>>#2 票数:-1

那这个呢,

function fnAppend(old_fn_name, new_fn){
    var old_fn = window[old_fn_name];
    window[old_fn_name] = function(){
        old_fn();
        new_fn();
    }
}

hello = function(){
    console.log("hello world!");
}

hello(); // hello world!
fnAppend('hello', function(){
    console.log("bye world!");
});
hello(); // hello world! bye world

只是为了展示这种方法,函数父window也可以是fnAppend函数的可选参数。 只需更改顺序, fnPrepend


编辑

function fnAppend(old_fn_name, new_fn, obj){
    obj = obj || window;
    var old_fn = obj[old_fn_name];
    obj[old_fn_name] = function(){
        old_fn.apply({},arguments);
        new_fn.apply({},arguments);
    }
}

  ask by Rogerio Chaves translate from so

未解决问题?本站智能推荐:

1回复

不处理dojo请求之前的Dojo方面

我有一个Dojo类,它使用dojo/request向服务器提交各种请求。 我需要使用dojo/aspect向这些请求添加之前建议。 该文档似乎相对容易理解。 我的类声明看起来像这样: 我的问题是,永远不会执行之前的建议。 我已经尝试了几种变体,例如,以this而不
2回复

在GridX树周围使用dojo方面时,对“ this”的引用丢失了

我正在尝试为GridX的树的expand功能使用一个around方面。 简化的代码如下所示: 但是很遗憾,道场方面的调用(即没有任何检查我的条件,等等)是有问题的。 单击expando后,将在控制台中引发错误: ...指向GridX树模块的expand原始功能的主体:
1回复

寻找面向Java的面向方面的框架(Android),该框架允许修改源[关闭]

我试图找到面向方面的框架,该框架可以修改.java源文件,而不是.class本身,到目前为止还算运气吗? 我知道这可能是一个愚蠢的主意...但是我要了解的是将确切的代码粘贴到.class上。 基本上我试图将日志记录和其他方面应用于大型android项目。 我正在与AspectJ一起玩,
1回复

C->函数库中面向方面的编程?

我正在学习使用aspeCt作为编译器的C语言中的AOP。 我遇到的问题是,在编译时,我不断从我的.acc文件中收到错误line 2 error--1: syntax error near token '' 。 我假设这是因为.acc文件中的before函数。 我应该导入一个图书馆吗?
2回复

在.Net和C#中反思面向和面向方面

.Net框架和特别是C#语言是否支持Reflect Oriented Programming和Aspect Oriented Programming ?
1回复

一个方面的数据访问

说我有以下分层架构... 我想实现一个需要某种形式的数据访问的方面。 堆栈中的每个项目都引用了方面框架。 因此,由于循环引用,我无法使方面程序集引用数据访问层。 那么我应该如何在方面进行数据访问呢?
1回复

重构与面向方面编程之间的区别

我很难理解重构和面向方面编程之间的区别。 我了解面向方面的编程旨在通过分离横切关注点来提高模块化,这也包括代码复制,缠结等。 但是重构也是在不改变其行为的情况下重构代码的过程,并且还包括代码重复等。 我是否理解错误,还是有人可以轻松地向我解释如何理解这两个? 谢谢..
1回复

获取方面的“方法参数”的名称? (AspectJ)

如何获取方面的参数名称,例如,如果我的方法是test(Sample sampleDto),则我需要知道方面的sampleDto名称。 如何从ProceedingJoinPoint获得它? 我尝试了这个,但是我得到了空值。
1回复

乌尔都语语言数据集,用于基于方面的情感分析

当我运行我的代码时,我收到此错误,因为什么>
1回复

使用@EnableAspectJAutoProxy发现方面的“手动”编织bean

我正在使用一个完全没有XML的Spring设置,我成功地将@EnableAspectJAutoProxy与我的@Configuration类一起使用,并使用@Aspect和@Component的组合查找我的方面类。 但是我已经达到了这样的程度,我需要按需编织/增强不是使用spring上下文