javascript钩子之Backbone里的实现

  前段时间,项目里有个需求,就是在某函数之前要添加一下验证,犹豫有很多地方需要添加一样的函数,而且要在这函数之后去执行以前的方法,所以打算用钩子这种东西去实现功能。在网上也看到了一些前辈写的钩子函数,功能大相径庭。就是定义一个数组,把你需要之前的数据插入到一个数组里,调用钩子的时候在把需要执行的功能依次的pop出来。还有一种实现是类似于代码劫持的概念。

1 var _alert = alert;
2 window.alert = function(s) {
3        console.log("Hooked!");
4         _alert(s);
5 }

套用之前的作者的话就是:这种Hook方式跟闹着玩儿似的,用到实际生产上通用性不好,效率也不高。

就我自身的项目,我是采用了类似拦截的实现方式,因为我没有那么多的嵌套关系,不太需要数组去添加方法。

项目是用backbone+require开发的SAP应用。

hook.js

‘use strict‘;
define([
    ‘backbone‘,
    ‘underscore‘,
    ‘jquery‘
], function(Backbone,underscore,$){

    var Hook = Backbone.Hook = function(){

        this.initialize.apply(this, arguments);

    }
    _.extend(Hook.prototype,Backbone.Events,{
        initialize : function(){
            _.bindAll(this,‘beforeAction‘,‘Action‘,‘beforeAction‘);
            this.addListenEvent();
        },
        /**
         * 添加验证钩子,处理权限验证时,无权限的控制方法。
         * @param res
         */
        premissionValidate : function(res){
            console.log(res);
        },
        /**
         * 钩子构造函数
         * @param actionName
         * @param args
         * @param callBack
         * @constructor
         */
        Action : function(args,callBack){
            var actionName = args.actionName;
            if(actionName === undefined){
                this.defaultAction(callBack);
            }else{
                //this.trigger(actionName,callBack)

                this[actionName](callBack);
            }
        },
        /**
         *  默认钩子处理函数
         */
        defaultAction : function(callBack){

            callBack && callBack();

        },
        /**
         * 自定义的动作
         * @param callBack
         */
        beforeAction : function(callBack){

            callBack && callBack();

        },
        afterAction : function(){

        },
        addListenEvent : function(){
            this.on(‘Action‘,this.Action);
            this.on(‘beforeAction‘,this.beforeAction);
            this.on(‘premissionValidate‘,this.premissionValidate)
        }

    });
    return Hook;

});

首先在main函数里注册hook类

Backbone.hook = new hook();

调用方法

设置actionName, 为你之后要去在代码之前或之后执行的程序名。Action为钩子的构造函数。

$.extend(options,{
    viewer : viewer,
    actionName : ‘beforeAction‘
});
Backbone.hook.trigger(‘Action‘,options,function(){
    /**
     * 添加钩子,在页面渲染之前进行某些特殊的动作,默认动作为Action。
     */
    viewer.render(options);
});

总结:钩子函数在本项目的应用场景有两个

第一:在页面渲染之前调用钩子函数,统一入口,方便添加统一逻辑。

第二:在公共的函数入添加钩子函数,增加验证方法。

时间: 2024-11-13 15:44:26

javascript钩子之Backbone里的实现的相关文章

javascript钩子机制

钩子机制是这样的,大家按照某一规则写一个方法(这个规则在方法名称上),然后页面加载完之前,统一执行所有的钩子函数. 注意callHooks方法,里面的局部变量s就是钩子函数名称中一定要有的内容.——这是使用钩子的方法! // 处理钩子的对象 var hook = (function(){ return { timer:null, init:function(){ this.callHooks('init'); }, callHooks:function(init){ var s = "hook_

JavaScript中的柯里化

今天在博客园首页看到一篇好文章 [译]理解JavaScript中的柯里化 加上最近工作中的一些感悟,算是对函数式编程语言(scala, python, javascrtpt)中的闭包,偏函数.柯里化有了更进一步的认识. 之前学Scala被绕的云里雾里的各种名词,现在也开始慢慢理解了. 上面那篇文章写的很好,这里就只说一下自己实际用到的一个例子. 现在需要对流速进行转换,流速的单位有 bps.Kbps.Mbps.Gbps.Tbps,从一个单位转换到另一个单位需要除N次1000. 可能需要有从bps

JavaScript 钩子

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script src="vue.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>

javascript之反柯里化(uncurrying)

在JavaScript中,当我们调用对象的某个方法时,其实不用去关心该对象原本是否被设计为拥有这个方法,这是动态类型语言的特点.可以通过反柯里化(uncurrying)函数实现,让一个对象去借用一个原本不属于他的方法. 通常让对象去借用一个原本不属于它的方法,可以用call和apply实现,如下 更常见的场景之一是让类数组对象去借用Array.prototype的方法: (function(){ Array.prototype.push.call(arguments,4) console.log

JavaScript怎么把对象里的数据整合进另外一个数组里

https://blog.csdn.net/qq_26222859/article/details/70331833 var json1 = [ {"guoshui":[ 300000, 500000, 600000, 800000, 1000000, 1200000, 1400000, 1600000, 1800000, 1600000, 1400000, 1200000 ]}, {"dishui":[ 1100000, 1200100, 1300000, 110

javascript中利用柯里化函数实现bind方法

柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预先存储的值进行相关的操作处理即可: 柯里化函数主要起到预处理的作用: bind方法的作用:把传递进来的callback回调方法中的this预先处理为上下文context; /** * bind方法实现原理1 * @param callback [Function] 回调函数 * @param con

浅谈JavaScript中的柯里化函数

首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu): 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的. 用于创建已经设置好了一个或多个参数的函数 与函数绑定相似,他们之间的区

vue过渡效果之--javascript钩子

写在前面 姊妹篇  vue.js之过渡效果-css.今天一篇博文阅读量破300,心里还是有点小激动的.没错,我就是这么容易满足(害羞).这个数据可能连大牛一篇文章阅读量的零头都没有,但这却是我个人的一大步,因为我在帮助别人.当然我没少受到别人文章的帮助.我想,也是大家这种乐于分享的心态让编程在一堆代码后面变得更加有人情味,前端变得更有意思. 什么是钩子 我当初看到钩子这个东西的时候也是一头雾水,尽管钩子这个翻译最初可能是想平易近人的,不让人望而生畏的.现在,就我的理解来说,钩子函数就像埋在一条道

javascript 自动选中容器里的文字

前些时间有这么个需求,需要实现选中div里面的文字,选中了的文字可直接按ctrl+v(或者右键)实现黏贴操作. html代码: <div id="text" class="text">大家好!</div> 调用以下javascript方法,实现选择上面div中的内容: 1 selectText("text") javascript代码: 1 function selectText(element) { 2 if (docu