是否可以在通用级别上覆盖"调用"函数,以便每次在应用程序中的任何位置调用方法时,都会发生某些事情.
我尝试重写Object.call,但是虽然我设法做到了,但它没有改变我的应用程序的工作方式.
顺便说一句,即使它有效,我每次都应该明确地调用"foo.call(this,args)",否则正常的函数调用也会起作用"foo(args)"?
听起来你想在这里做一些面向方面的编程....
JavaScript作为ECMAScript方言,确实具有可调用对象的概念.每个可调用对象都有一个名为的内部属性[[Call]].该属性在ECMA-262规范第5版的第8.6.2节表9中描述.它说:
执行与对象关联的代码.通过函数调用表达式调用.SpecOp的参数是一个this对象和一个包含传递给函数调用表达式的参数的列表.实现此内部方法的对象是可调用的.只有作为宿主对象的可调用对象才能返回Reference值.
但需要注意的是,这[[Call]]是一个内部属性,规范说:
内部属性没有名称,也无法通过ECMAScript语言运算符直接访问.内部属性纯粹出于规范目的而存在.
因此,您无法在自己的JavaScript代码中使用此机制.
现在有是在定义了两个方法Function.prototype,apply和call.确实,如果你在Function.prototype.call创建自己的函数时更改了then 的定义f,那么f.call确实(除非在f的原型或f本身中被覆盖)执行该代码.正如您所假设的那样,这不会通过f直接呼叫自动发生.您必须显式调用该call方法.
总而言之,最好不要在内置对象的原型中使用预定义的标准方法.库和应用程序中的许多现有代码依赖于Function.prototype.call.不要乱用它.当然,您可以通过多种方式实现一种AOP行为.一种是添加到Function.prototype其他方法,但也不要这样做.另一种方法是使用前后钩子编写自己的调用方法:
function call(theThis, before, main, after, beforeArgs, mainArgs, afterArgs) {
before.apply(theThis, beforeArgs);
main.apply(theThis, mainArgs);
after.apply(theThis. afterArgs);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2980 次 |
| 最近记录: |