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 の任意のインスタンスでこれを使用して myFunc.staticFunc にアクセスできるという意味ではありません...

インスタンス化できるオブジェクトのようなクラスを定義するには、それを関数として定義し、プロトタイプを拡張します。プロトタイプは、オブジェクトのインスタンスを構築するために使用されるクラス定義です。

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 の実装では、マスター関数の基本的なルーティングを処理する別の内部関数があり$()ます。

また、「グローバル」$.whatever()関数は、jQuery インスタンス (関数から返されるオブジェクト) によってサポートされる一連のメソッドとはあまり関係がないことにも注意してください$()。これらの$グローバル ユーティリティがグローバル (ウィンドウ) 名前空間を汚染しないように、オブジェクトは単に名前空間として機能します。

于 2013-09-23T17:02:13.543 に答える