0

解释

首先,我可能混淆了 jQueryconstructorinit函数,如果是这样,请忽略我下面的术语。

我有一个名为 的对象SineMacula,目前它只是充当方法库的命名空间。

但是,我将要为对象编写一些方法SineMacula,我想将其用作 jQuery 扩展。

这里出现了复杂性,而不是使用 jQuery 别名$,我想使用该SineMacula对象来运行 jQuery 构造。如此有效地,我的代码将如下所示:

SineMacula('#test').dropdown();

代替:

$('#test').dropdown();

但是,如果不是因为我的下一点,我认为这不会太难:

我不想给整个 jQuery 起别名,我只是想让 jQuery 构造函数在我调用时运行SineMacula('something'),然后将任何方法应用于SineMacula('something')

我的问题

问这个问题的最好方法是通过说明。以下可能吗?

SineMacula('#test').someFunction(function(){
    // Do something here
    // The jQuery object must be passed in so that
    // $(this) refers to SineMacula('#test')
});

但是,我不想这样做(完全别名 jQuery):

SineMacula('#test').animate(); // A regular jQuery function

我知道这可能是不可能的,但觉得值得一问:-)

更新 1

为了清楚起见,这是我目前用于该SineMacula对象的一些代码:

/**
 * Sine Macula Javascript  API
 * The Sine Macula API contains all base functions for use throughout
 * all websites
 * @name class.sinemacula.js
 * @author Ben Carey
 * @version 1.0
 * @date 25/10/2012
 * @copyright (c) 2012 Sine Macula MMVIII Limited (sinemacula.co.uk)
 */

function SineMacula(){

    // Only proceed if jQuery has been loaded
    if(typeof jQuery=='undefined'){
        // jQuery has not been loaded
        console.log('jQuery has not been loaded');
    }else{

        /**
         * Sine Macula Load
         * Load the Sine Macula Libraries and Plugins
         * into the current document
         *
         * The options:
         * - package: the package of libraries to load
         * - packageURL: a remote source to load the package details from
         * - libraries: any additional libraries to load
         *
         * @param object options The options for the Sine Macula load
         */
        this.load = function(options){
            // Load Sine Macula Libraries here
        }
    }
};

/**
 * Overlay
 * Place an overlay on the page
 *
 * The options:
 * - wrapper: the wrapper to prepend to
 * - fade: indicate whether or not to fade the overlay
 * - fadeSpeed: the fade speed for the overlay fade
 * - opacity: the opacity to apply to the overlay
 * - color: the color to apply to the overlay
 * - callback: the callback to be called once the function has completed
 *
 * @param boolean showHide A boolean to indicate whether to show/hide the overlay
 * @param object options The options for the overlay
 */
SineMacula.prototype.overlay = function (showHide,options){
    // Process the overlay here
};

// All libraries are extended onto the SineMacula object

SineMacula对象在每个页面的顶部启动,如下所示:

<script src="//libraries.example.net/jsapi" language="javascript" type="text/javascript"></script>
<script language="javascript" type="text/javascript">

    var sm = new SineMacula();
    sm.load();

</script>

更新 2 - 忽略以上

是的,我发现很难解释我想要实现的目标。下面我会尽我所能分步完成,忽略上面的内容。

第1步

我有一个名为 的类SineMacula,它包含许多可以做各种事情的方法。把它想象成一个像 jQuery 一样的库。

这是这样定义的:

function SineMacula(){

    // Only proceed if jQuery has been loaded
    if(typeof jQuery=='undefined'){
        // jQuery has not been loaded
        console.log('jQuery has not been loaded');
    }else{
        this.load = function(options){
            // Load Sine Macula Libraries here
        }
    }
};

第2步

该类SineMacula在每个页面的顶部使用以下代码启动:

<script src="//libraries.example.net/jsapi" language="javascript" type="text/javascript"></script>
<script language="javascript" type="text/javascript">

    var sm = new SineMacula();

</script>

第 3 步

然后,该对象通过调用例如加载该SineMacula对象所需的任何库和扩展。这会将任何扩展动态加载到网页中。SineMaculasm.load({package:'all'})

第4步

扩展定义如下:

SineMacula.prototype.doSomething = function(){
    // Do something here
}

第 5 步 - 这是事情变得更复杂的地方

到目前为止,该SineMacula对象一直充当诸如doSomething()etc之类的方法的命名空间。

我现在想定义的方法不仅仅是作为一个函数。

在我本来可以调用的地方SineMacula.doSomething(),我现在希望能够调用SineMacula('#test').doSomething()where与 jQuery 中SineMacula('#test')的行为相同$('#test')

所以我可以像这样访问我的功能:

SineMacula.doSomething('maybe parameters here');
SineMacula('selector').doSomethingElse('maybe parameters here');

与您可以调用的方式相同:

$.ajax('parameters');
$('selector').animate('parameters');

因此,如果将参数传递给SineMacula对象,则使用 jQuery选择器函数对其进行处理,并作为主题传递给被调用的方法。

例如:

// Call doSomethingElse on the #test element
SineMacula('#test').doSomethingElse();

// Within the doSomethingElse function $(this) relates to $('#test')

总结...

SineMacula('selector')就像提供了$('selector')一样'selector',这被传递给子方法。但SineMacula不是 jQuery 的扩展。我不想SineMacula成为一个别名$

4

1 回答 1

1

如果我理解这个问题并且您是否可以更改SineMacula构造函数

function SineMacula(){
     // add following 3 lines
     if(arguments.length>0) {
        return jQuery.call(null,arguments);
     }
    // Only proceed if jQuery has been loaded
    if(typeof jQuery=='undefined'){
        // jQuery has not been loaded
        console.log('jQuery has not been loaded');
    }else{

        this.load = function(options){
            // Load Sine Macula Libraries here
            console.log("ok load");
        }
    }
};
于 2012-10-31T10:33:50.087 回答