Creating a jQuery like “$” object

前端 未结 8 1358
伪装坚强ぢ
伪装坚强ぢ 2020-12-08 03:25

My end goal is being able to do something like this:

MyVar(parameter).functionToPerform();

Silly enough, even after reading up on how varia

8条回答
  •  無奈伤痛
    2020-12-08 03:54

    As I write this, Squeegy's answer has the highest number of votes: 7. Yet it is wrong because __proto__ is non-standard and is not supported by Internet Explorer (even version 8). However, getting rid of __proto__ does not get it working either in IE 6.

    This (somewhat simplified) is the way jQuery actually does it (even try it on IE 6), and it also includes examples of static methods and method chaining. For all the details of how jQuery does it, of course, you will have to check the jQuery source code yourself.

    var MyClass = function(context) {
        // Call the constructor
        return new MyClass.init(context);
    };
    
    // Static methods
    MyClass.init = function(context) {
        // Save the context
        this.context = context;
    };
    MyClass.messageBox = function(str) {
        alert(str);
    };
    
    
    // Instance methods
    MyClass.init.prototype.print = function() {
        return "Printing";
    };
    MyClass.init.prototype.move = function() {
        return this.context;
    };
    
    // Method chaining example
    MyClass.init.prototype.flash = function() {
        document.body.style.backgroundColor = '#ffc';
        setInterval(function() {
            document.body.style.backgroundColor = '';
        }, 5000);
        return this;
    };
    
    
    $('#output').append('
  • print(): '+ MyClass().print() +'
  • '); $('#output').append('
  • flash().move():'+ MyClass('azerty').flash().move() +'
  • '); $('#output').append('
  • context: '+ MyClass('azerty').context +'
  • '); MyClass.messageBox('Hello, world!');

    Note that if you need "private" data, you will have to put instance methods inside MyClass.init (with a variable declared just inside that function) as this.print = function() { ... }; instead of using MyClass.init.prototype.

提交回复
热议问题