1

我似乎找不到我想要实现的目标的例子,尽管我确信它之前已经做过很多次了......

我想创建一个具有一组属性和成员函数但我也可以直接调用的对象。以同样的方式,jQuery 对象允许您调用$("selector")$.method(...)

这是我想要实现的精简版:

var foobar = function(param) {
    return "FOO : " + this.lookup(param);
}

foobar.vals = {
    1: "one",
    2: "two"
};

foobar.lookup = function (param) {
    return "BAR : " + this.vals[param];
}

foobar.lookup("1")
// returns "BAR : one"

foobar("1")
// returns error since 'this' points to global scope
// I'd want it to return "FOO : BAR : one"

我也尝试过使用函数原型的各种方法,但似乎找不到能满足我所有需求的方法...

4

3 回答 3

1
var foobar = function(param) {
    return "FOO : " + foobar.lookup(param);
}

会给你你想要的

要理解这一点,也许您应该看一下 JavaScript 的基础知识。什么是函数如何实例化一个对象以及什么是对象...

要获得像 JQuery 这样的东西并不是很困难,JQuery 主对象只是一个具有“静态”功能的函数。

将变量声明为您所做的函数

var myFunc = function(){};

要使用变量并使用静态内容扩展它,您只需通过

myFunc.staticFunc = function(){};

这并不意味着 myFunc.staticFunc 可以在 myFucn 的任何实例中使用 this 访问,因为您没有将函数添加到原型中......

要定义一个可以实例化的类对象,您还可以将其定义为函数,然后扩展原型。Prototype 是您的类定义,用于构造对象的实例:

myFunc = function(){
  // ctor
  this.lala = "blub";
} ;

myFunc.prototype.objectFunc = function() { 
   return this.lala;
}

现在对象 myFunc 有一个函数 objectFunc。我必须用新的初始化它...

alert(new myFunc().objectFunc());

实例可以用这个访问自己...

要执行类似 jquery 的操作,您必须使用一些技巧。你的全局变量必须是一个函数,它返回你的“真实”对象的一个​​实例,它可以实现任何......

然后你可以像调用函数一样调用你的变量,例如 myFunc()...

希望下面的例子能更清楚地说明它是如何工作的:(可以在 jsfiddle 上找到

(function ($) {

    var myRealObj = function (outId, printText) {
        this.text = printText;
        $("#" + outId).append("<li>" + this.text + "</li>");
    };

    myRealObj.prototype.objectFunc = function () {
        return this.lala
    };

    var myFunc = function (out, txt) {
        return new myRealObj(out, txt);
    };

    myFunc.someFunc = function () {
        myFunc("out", "myFunc.someFunc got called");
    };

    myFunc.static = {};
    myFunc.static.someFunc = function () {
        myFunc("out", "myFunc.static.someFunc got called");
    };


    window.$$ = myFunc;
})($);

$$("out", "test obj function");
$$.someFunc();
$$.static.someFunc();
于 2013-09-23T17:00:03.567 回答
0

您可以添加:

foobar = foobar.bind(foobar);

使变量引用函数的绑定版本。对(更新的)“foobar”的任何调用都将this绑定到原始函数对象。如果您想直接获取属性,您还必须镜像属性,这有点混乱。

在 jQuery 实现中,有一个单独的内部函数来处理主$()函数的基本路由。

另请注意,“全局”函数与 jQuery 实例(从函数$.whatever()返回的对象)支持的方法集并没有太大关系。$()$对象仅用作命名空间,因此这些全局实用程序不会污染全局(窗口)命名空间。

于 2013-09-23T17:02:13.543 回答
-1

var foobar = function(param) {...在全局范围内声明,因此this将始终是window

于 2013-09-23T17:01:21.717 回答