`
WKsandy
  • 浏览: 148551 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

jQuery模拟prototype的inject方法

阅读更多

    首先来看看prototype.js里的inject方法
    手册中的描述:

      inject(accumulator, iterator) -> accumulatedValue  基于迭代子所产生的前一个结果递增地构建一个结果值。可以用来构建数组、数字数额/平均值等等。

    用法: 

[1, 2, 3].inject([], function(array, value) { 
    array.push(value * value); return array;
}); 
// 构建给定数组各元素平方的数组 -> [1, 4, 9]

 

    在jQuery也能找到个方法能达到上面的效果
    手册中的描述:

      jQuery.map(array,callback) -> Array 将一个数组中的元素转换到另一个数组中。作为参数的转换函数会为每个数组元素调用,而且会给这个转换函数传递一个表示被转换的元素作为参数。转换函数可以返回转换后的值、null(删除数组中的项目)或一个包含值的数组,并扩展至原始数组中。

$.map( [1,2,3], function(value){
    return value * value;
}); 
// -> [1, 4, 9]

 

    现在我要把一个数组里各个元素值累加,比如[1,2,3,4]要得到10
    用prototype的inject方法实现

$R(1,4).inject(0, function(acc, value) {
    return acc + value;
}) 
// -> 10

 

   这回map方法不好用了,map方法是转换到数组去的,我们直接要值,没关系,还有其他方法

   jQuery.each(obj,callback)  通用例遍方法,可用于例遍对象和数组。

 

var result =0; 
$.each( [1,2, 3,4], function(i,value){ 
    result += value; 
}); 
//result->10;

 

    当然,prototype也有each的遍历方法,实现方法差不多

 

var result =0; 
[1, 2, 3,4].each(function(value,i){ //[1,2,3,4]正好是个范围用$A($R(1,4))或者$R(1, 4)或者$(1,2,3,4)都行 
    //另外prototype和jQuery的回调函数参数顺序是反的 
    result += value; 
}); 
//result->10;

 

    现在我在考虑能不能也给jQuery加个inject方法呢

    ok,就模拟prototype,以插件形式来给jQuery对象扩展个inject方法吧

 

;(function($) {
        $.extend({
                inject : function(_array, memo, iterator) {
                      $.each(_array, function(index, value) {
                             memo = iterator(memo, value, index);
                       });
                       return memo;
                }
        });
})(jQuery);

 

    好了,现在就来看看写的插件能调用到方法的效果吧

 

$.inject([1, 2, 3, 4], [], function(array, value) {
       array.push(value * value);
       return array;
}); // -> [1, 4, 9,16]
$.inject([1, 2, 3, 4], 0, function(acc, value) {
       return acc + value;
}); // 返回数组各元素累加后的值 ->10;
$.inject([1, 2, 3, 4, 5], 1, function(acc, value) {
       return acc * value;
});// 返回数组各元素相乘后的值 ->120

 

注:在prototype1.6版本新加段iterator = iterator.bind(context);用于动态绑定this上下文

//这个我一开始的写法
iterator = (function(fn, context) {
        var args = Array.prototype.slice.call(arguments, 2);
        return args.length == 0 ? function() {
                return fn.apply(context, arguments);
        } : function() {
                return fn.apply(context, args.concat.apply(args, arguments));
        };
})(iterator, context);

//这个是把ptototype中用到相关方法整合的结果
iterator = (function(fn, context) {
        if (arguments.length < 3 && typeof arguments[1] == "undefined")
                return fn;
        var args = Array.prototype.slice.call(arguments, 2);
        return function() {
                var a = (function(array, args) {
                        var arrayLength = array.length, length = args.length;
                        while (length--)
                                array[arrayLength + length] = args[length];
                        return array;
                })(Array.prototype.slice.call(args, 0), arguments);
                return fn.apply(context, a);
        };
})(iterator, context);

 

 

分享到:
评论

相关推荐

    基于jQuery的SQL注入攻击防范实现

    ### 基于jQuery的SQL注入攻击防范实现 #### 一、引言 SQL注入攻击是Web应用程序中常见的安全威胁之一。它通过恶意输入来操纵数据库查询,从而获取未授权的数据或执行非法操作。传统的防御措施多集中在服务器端,如...

    jQuery Inject-crx插件

    语言:English (United States) 在页面中插入jQuery。 点击Chrome右上方的图标,将jQuery插入任何页面。 --Changelog--版本1.1.0:-将默认JQuery更新为3.3.1

    注入jQuery「Inject jQuery」-crx插件

    将jQuery添加到当前选项卡。 允许您将jQuery 1.8.1注入任何页面。 -适用于HTTP和HTTPS-可以选择在所有标签上以及通过页面重新加载来保留 支持语言:English

    javax-inject-1.0-201002241208.jar.zip

    在本文中,我们将深入探讨javax.inject的核心概念、使用方法以及与Hibernate框架的集成。 一、javax.inject简介 javax.inject包提供了三个主要的注解:@Inject、@Named和@Provider。这些注解帮助开发者声明和管理...

    官方jar包javax-inject.jar

    7. **优势**:使用`javax-inject.jar`进行依赖注入,可以使代码更加清晰、简洁,减少硬编码,增强代码的可读性和可维护性,同时便于单元测试,因为测试时可以更容易地替换或模拟依赖。 8. **使用方法**:在Java项目...

    VC代码 RT_INJECT (实用代码源)

    VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码...

    InjectDLL_injectDll_

    Usage: injectdll.exe [process name] [dll path] [option number]option 1 - CreateRemoteThreadoption 2 - NtCreateThreadExoption 3 - RtlCreateUserThread

    Jquery+ajax+php+mysql数据库实现用户注册登录

    6. **jQuery.sqlInject.js**:这个文件可能是一个扩展库,提供了一种方便的方法来执行SQL查询,可能是为了简化PHP与MySQL数据库之间的交互。 7. **login.js**:这是项目的前端JavaScript文件,其中包含了处理用户...

    vue 解决provide和inject响应的问题

    官网上说provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。 provide: Object | () =&gt; Object(一个对象或返回一个对象的函数) inject...

    autoinject小工具

    同时,它也提供了一个安全的环境,用于模拟和研究注入攻击,避免在实际网络环境中造成潜在的危害。 其次,让我们深入了解一下DLL注入的工作原理。在Windows系统中,当一个进程启动时,它可以加载其他DLL文件。DLL...

    javax.inject.Provider

    Spring 依赖的 javax.inject.Provider

    javax-inject.jar.zip

    `javax.inject.Inject`注解是最核心的注解,它用于标注一个构造函数、字段或方法,表明这个构造函数、字段或方法的依赖应该由外部容器(如Google Guice、Spring框架等)自动注入,而不是由类自己创建。通过这种方式...

    Android 跨进程模拟按键(KeyEvent )实例详解

    在Android开发中,有时我们需要模拟按键事件,...通过上述方法,开发者可以实现类似手机遥控器的功能,使得应用能够模拟按键事件,即使在后台或跨进程情况下也能正常工作。希望本文能对你在处理此类问题时提供帮助。

    .javax.inject_1.0.0.jar

    1. `@Inject`:这是最基础的注解,用于标记一个字段、构造函数或者方法参数,表示该成员需要被依赖注入。容器会在运行时自动提供合适的实例。 2. `@Named`:这个注解用于为注入的对象指定一个唯一的名称。在有多个...

    CodeInject.rar

    code inject 逆向工程 做一些工具必备

    Inject HTTP.zip_Inject HTTP vb6_Inject2Download_http inject_inje

    2. **inject2download**:可能是指一种能够利用HTTP注入下载远程文件的方法或工具。 3. **http_inject**:强调了HTTP协议层面的注入活动。 4. **inject**:通用术语,表示注入行为,可能包括多种类型的注入攻击。 ...

    inject.dmg 14.1

    标题中的"inject.dmg 14.1"指的是一个名为"inject"的磁盘映像文件,版本为14.1。在IT行业中,".dmg"是苹果操作系统(macOS)中常用的磁盘映像格式,用于分发软件或系统更新。14.1可能代表该软件或系统的具体版本号。...

    jQuery基础

    jQuery.fn = jQuery.prototype = { init: function( selector, context ) { // Make sure that a selection was provided selector = selector || document; // Handle $(DOMElement) if ( selector.nodeType ...

    Location IOS13驱动版本,包含inject.dmg和inject.dmg.signature两个文件

    总之,这个压缩包包含的“inject.dmg”和“inject.dmg.signature”文件是iOS 13系统定位服务驱动的更新,提供增强的定位功能和安全性。在使用时,用户需要验证签名以确保文件的合法性,并根据设备的当前iOS版本进行...

    sisu-inject-bean-1.4.2.jar

    sisu-inject-bean-1.4.2.jar

Global site tag (gtag.js) - Google Analytics