5

我的问题很奇怪,它与我在 jQuery 中看到的东西有关,但到目前为止我无法重新创建它。

在 jQuery 中你可以这样

jQuery('div').append

或者

jQuery.ajax

我正在制作的应用程序需要类似的语法,我注意到如果你使用 new like

var that=new function(){
}

你可以用它来调用这个函数,没有(),但在某些情况下我会需要它。

这样做的原因是我需要像 jQuery 一样选择一个 dom 元素的一些功能。

that('[data-something="this"]').setEvent('click',functin(){})

有些人会自动这样做:

that.loadIt('this','[data-something="that"]') 

这样做的原因是 dom 元素是从外部加载并推送的,然后脚本等待它准备好再继续。并且这样做,无论如何对我来说似乎是获得此功能的最干净的方法(我正在编写一个完整的 javascript 框架,所以我避免使用库来保持脚本快速)

4

3 回答 3

5

函数是对象并且可以具有属性,就像其他对象一样。因此,您可以像这样向函数添加属性:

function myFunc(){}
myFunc.someFunc = function(){}

如果您使用new myFunc生成的对象,则不会有someFunc,因为它不是prototype.

所以,你可以做这样的事情:

function myFunc(){
    // This lets you do "myFunc()" instead of "new myFunc()"
    if (!(this instanceof myFunc)) {
        return new myFunc();
    }
    else{
        this.val = 0;

        this.setVal = function(x){
            this.val = x;
            // for function chaining
            return this;
        }

        this.getVal = function(){
            return this.val;
        }
    }
}

// This function is not part of the prototype
myFunc.test = function(){
    alert('hi');
}

// Some tests
var obj = myFunc();
obj.setVal(12).getVal(); // 12

myFunc.test();

obj.test(); // Error: 'test' is not a function

myFunc.getVal(); // Error: 'getVal' is not a function
于 2012-09-12T18:42:43.710 回答
5

函数是对象。

只需摆脱new,并将属性直接添加到that.

var that = function() {
    // do some work
}

that.loadit = function() {
    // do other work
}

由于您正在尝试实现类似 jQuery 的功能,因此that请调用构造函数。

;(function(global) {

       // function to be publicly exposed
    var that = function(foo, bar) {
        return new MyLibrary(foo, bar);
    }

       // publicly expose the function
    global.that = that;

       // use the function as a namespace for utilities
    that.loadit = function() {
        // do other work
    }

       // The actual constructor function, like the internal jQuery constructor
    MyLibrary(foo, bar) {
        // constructor function
    }

       // Prototypal inheritance of objects created from the constructor
    MyLibrary.prototype.setEvent = function() {
        // do some work
        return this;  // allows for method chaining
    };
    MyLibrary.prototype.otherMethod = function() {
        // do something else
        return this;  // allows for method chaining
    };
})(this);
于 2012-09-12T18:42:55.090 回答
0
$.fn.loadIt=function(var1,var2) {
  // $(this) is automatically passed
  // do stuff
}

像这样称呼它

$('#element').loadIt('a variable','another variable');
于 2012-09-12T18:42:33.743 回答