attaching a class to a jQuery object

前端 未结 1 1487
半阙折子戏
半阙折子戏 2021-01-21 06:31

I\'m struggling with how best to combine javascript Classes and jQuery plugins. This question isn\'t very specific, what I\'m hoping for is pointers to more resources.

B

相关标签:
1条回答
  • 2021-01-21 07:26

    Here's a proposed solution. It combines few different approaches (John Resig's inheritance model and Alex Saxton's plugin inheritance model).

    Define your inheritable plugin:

    (function ($) {
    
        My.Plugin = Class.extend({
    
            /*
            * Initialization (constructor)
            */
            init: function (element, meta) {
                var $meta = $.extend({ name: "pluginName" }, meta);
    
                // Call the base constructor
                this._super(element, $meta);
    
                // TODO: Add custom initialization code like the following:
                // this._testButton = $('.testButton', element).get(0);
            },
    
    
            /*
            * Public methods
            */
    
            show: function() {
                 alert('This is a public method');
    
            },
    
    
            /*
            * Private methods
            */
    
            // DEMO: Overriding the base _paint method:
            _paint: function () {
    
                // "this._super()" is available in all overridden methods
                // and refers to the base method.
                this._super();
    
                alert('TODO: implement myPlugin._paint!');
            }
    
    
        });
    
    
        // Declare this class as a jQuery plugin
        $.plugin('my_plugin', My.Plugin);
    
    
    })(jQuery);
    

    Define Base class

    (function () {
        var initializing = false, fnTest = /xyz/.test(function () { xyz; }) ? /\b_super\b/ : /.*/;
        // The base Class implementation (does nothing)
        this.Class = function () { };
    
        // Create a new Class that inherits from this class
        Class.extend = function (prop) {
            var _super = this.prototype;
    
            // Instantiate a base class (but only create the instance,
            // don't run the init constructor)
            initializing = true;
            var prototype = new this();
            initializing = false;
    
    
            // Copy the properties over onto the new prototype
            for (var name in prop) {
                // Check if we're overwriting an existing function
                prototype[name] =
                       typeof prop[name] == "function"
                    && typeof _super[name] == "function"
                    && fnTest.test(prop[name])
                        ? (function (name, fn) {
                            return function () {
                                var tmp = this._super;
    
                                // Add a new ._super() method that is the same method
                                // but on the super-class
                                this._super = _super[name];
    
                                // The method only need to be bound temporarily, so we
                                // remove it when we're done executing
                                var ret = fn.apply(this, arguments);
                                this._super = tmp;
    
                                return ret;
                            };
                        })(name, prop[name])
                        : prop[name];
            }
    
            // The dummy class constructor
            function Class() {
                // All construction is actually done in the init method
                if (!initializing && this.init)
                    this.init.apply(this, arguments);
            }
    
            // Populate our constructed prototype object
            Class.prototype = prototype;
    
            // Enforce the constructor to be what we expect
            Class.constructor = Class;
    
            // And make this class extendable
            Class.extend = arguments.callee;
    
            return Class;
        };
    })();
    

    Plugin Creation

    (function ($) {
    
        //  The "inheritance plugin" model
        //  [http://alexsexton.com/?p=51][1]
    
        $.plugin = function (name, object) {
            $.fn[name] = function (options) {
                var instance = $.data(this, name, new object(this, options));
                return instance;
            };
        };
    })(jQuery);
    

    Calling your plugin from javascript:

    $('#someElem').my_plugin({options: {}, data: {} /* you can modify your plugin code to accept anything */}).show();
    

    Note:

    Private methods here are marked as _methodName. It's pure convention. If you really want to hide them, you can use module pattern (google for it or here's one for starters: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth)

    Is this what you're looking for?

    0 讨论(0)
提交回复
热议问题