js动态代理

最近公司的产品陆续跟其他网站有合作,麻烦的是每个网站都有个性化的需求,有的需要自己的logo,有的需要定制的广告。

例如默认我们显示的是Google广告 http://www.wangchao.net.cn/bbsdetail_1950471.html

但是此站需要专门显示旅游类广告 http://www.wangchao.net.cn/bbsdetail_1950471.html

产品的UI相当复杂,hard code 当然是不能接受的。此时我很怀念我当年在.net用的Windsor,于是马上弄了个动态代理出来(对动态语言来说是小菜一碟),让我能给特定的宿主网站通过添加额外的js文件注入自己定制的代码

(function(){
var interceptors = {};
$.intercept = function(name, func){
 var parts = name.split('.');
 var owner = window;
 for (var i = 0; i < parts.length - 1; i++){
  owner = owner[parts[i]];
  if (!owner) break;
 }
 if (owner){
  var funcName = parts[parts.length - 1];
  var target = owner[funcName];
 }
 if (!(owner && target)){
  interceptors[name] = func;
  return;
 }
 owner[funcName] = function(){
  this.__invocation__ = target;
  func.apply(this, arguments)
 }
}
    
 $._ = function(name, func, scope, args){
  var interceptor = interceptors[name];
  if (interceptor){
   scope = scope || window;
   scope.__invocation__ = func;
   return interceptor.apply(scope, args || []);
  }
  else {
   return func.apply(scope, args || []);
  }
 }
})()

要拦截函数很简单,以被拦截的函数名和用于拦截的函数为参数

$.intercept = function('objectName.methodName', function(){
//do something
//and invoke the original method if needed
this.__invocation();
})

 

时间: 2024-08-30 23:25:38

js动态代理的相关文章

JAVA核心层--反射--动态代理

本文发表于2010年,时间较早,部分问题解释不是十分准确,所以需要进一步了解,请参看2012年版本: java之架构基础-动态代理&cglib 要在JAVA技术上突破普通的层面,并拥有一翻设计理念的高度,除了要有很好的设计思维之外,反射在适当的使用下,将会把框架做得非常清晰,并且代码编写也非常简便. 在面向对象的编程中,我们为什么要忌讳去大量使用if else switch语句,因为这样写是将逻辑硬编码了,JAVA的思想就是将其配置化,一旦可配置化后,就逐渐可管理化,并随着产品的成熟逐步实现自动

java之架构基础-动态代理&amp;amp;cglib

本文核心主要参数动态代理和cglib: 在以前的文章中,有提及到动态代理,它要解决的就是,当我们的某些代码前面或后面都需要一些处理的时候,如写日志.事务控制.做agent.自动化代码跟踪等,此时会给你带来无限的方便,这是JVM级别的提供的一种代理机制,不过在这种机制下调用方法在JVM7出来前还没有invokeDynamic的时候,调用的效率是很低的,此时方法调用都是通过method的invoke去实现. 其基本原理是基于实现JVM提供的一个: InvocationHandler的接口,实现一个方

JDK和CGLIB生成动态代理类的区别

 关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代理:事先写好代理对象类,在程序发布前就已经存在了: 动态代理:应用程序发布后,通过动态创建代理对象. 静态代理其实就是一个典型的代理模式实现,在代理类中包装一个被代理对象,然后影响被代理对象的行为,比较简单,代码就不放了. 其中动态代理又可分为:JDK动态代理和CGLIB代理. 1.JDK动态代理

Java动态代理、cglib动态代理

说动态代理,需要先清楚静态代理.所谓静态代理就是程序员提前实现好的代理类,编译后class文件是已经存在的. 实现原理,利用Java代理模式,由一个代理类持有委托类的实例,并实现委托类一样的接口,来实现增强方法的目的. 我们主要用它来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情,甚至根本不去执行这个方法.因为在InvocationHandler的invoke方法中,你可以直接获取正在调用方法对应的Method对象.比如可以添加调用日志,做事务控制,对

js动态创建div等元素实例

为了节省时间,就直接贴代码了!希望大家多多的关注我! <html> <head> <title>js动态创建div等元素实例</title> <style type="text/css"> </style> </head> <body> <script language="javascript"> var Test={ createDiv:function()

PHP4中实现动态代理

动态 一. 摘要本文简单阐述了Proxy模式及具体说明了如何在PHP4中实现动态代理, 本文只是给出了一个实现的方法的原型. 由于水平有限, 有任何意见和建议请反馈给Binzy [ Binzy at JustDN dot Com ]. 二. 概述在我们开始实现Dynamic Proxy之前, 也许我们应该先了解一下什么是Proxy和它有什么用. 下面是一篇来自博客堂加菲猫的不错的形象讲述Proxy的文章: "武当学艺与缓存代理". Proxy模式是"GoF"介绍的2

js动态增加删除行

js动态增加删除行代码,很实用. 所做过的多个项目中均用到js动态添加删除行的应用,在写过多种方案后,最终整理出这个最为方便应用的方案,以备日后拿来便用: 以下是DEMO全部代码: <html>  <head>   <title>Ace Test</title> <script language="JavaScript">      var cGetRow=-99999;   function insertrow(){   v

js动态获得滚动条宽度 JavaScript,js

javascript|js|动态 我现在有一个层,层中有一个div,当内容比较多的时候就出现滚动条,我现在想,当滚动条出现的时候,div中表格的宽度等于div的宽度减去滚动条的宽度,如何才能去动态获得滚动条的宽度,或者判断滚动条的状态既是否出现.------------------------------------------------------------------------------------ 是不是想这样?<div id="demo" style="

动态代理DynamicProxy 介绍

我们使用动态代理,主要是因为动态代理拥有这样的能力--使得某个类型A在运行的时候能转化为一个指定的接口I,即使这个类型A在定义的时候并没有从这个指定的接口I继承.这句话是什么意思了?还是回到当泛型的参数类型是动态的... 一文中的那个例子,在例子中,List<>并没有从ISimpleList继承,但是从表面看来,在运行的时候,我们通过动态代理可以以ISimpleList接口来"引用"List<>类型的对象. 动态代理是在运行时在内存中构建的一种类型,该类型实现了