4

次のコードで何が起こっているのか、誰か説明してもらえますか? include() と exclude() の意味は理解できましたが、特定の関数をいつ、なぜ使用するのでしょうか?

var Class = function () {
    var klass = function () {
        this.init.apply(this, arguments);
    };

    klass.prototype.init = function () {};

    klass.fn = klass.prototype;
    //shortcut to access class
    klass.fn.parent = klass; //where do we use it?

    //adding class properties
    klass.extend = function (obj) {
        var extended = obj.extended; //what is happening here?
        for (var i in obj) {
            klass[i] = obj[i];
        }
        if (extended) extended(klass) //didn't understand this part
    };
    //adding instance properties
    klass.include = function (obj) {
        var included = obj.included; //??
        for (var i in obj) {
            klass.fn[i] = obj[i]; //??
        }
        if (included) included(klass) //??
    };
    return klass;
};
var Person = new Class; // is this same as: var Person = new Class();
4

3 に答える 3

2

彼はそれをAlex MacCaw の Javascript Web Applicationsから入手しました。目的は、Javascript クラスの実装、および適切なモジュール性と継承の使用を示すことです。著者の説明は非常に抽象的で、Prototype.js などのライブラリが使用されているかどうかは明記されていません。

この質問への良い追加は次のとおりだと思います。

  • これはすべてネイティブ Javascript のように見えますか?
  • Javascript のネイティブ メソッドを拡張/拡張および組み込み/組み込みですか?
于 2013-01-24T02:13:51.717 に答える
0

私がそれをどのように理解したかを提供したいと思います。これを定義と実装 (または使用法) の 2 つの部分に分けます。上記で引用した定義に従って、次のコードとして使用法を追加します。

var Person = new Class;

Person.extend({
    find: function(id) { /* definition */
    },
    exists: function(id) { /* definition */
    }
});
Person.include({
    save: function(id) { /* definition */
    },
    destroy: function(id) { /* definition */
    }
});

var person_e = Person.find(1);
var person_e = Person.exists(2);

var person = new Person;
person.save();
person.destroy(2);

このコードを前のコードと続けて参照してください。何が起こるかを列挙しようと思います:

  1. クラスは関数定義を保持するように設定されています。まだ実行されていないため、クラスは関数定義が書き込まれているメモリ内のそのブロックを指します。
  2. var Person = new Class -> これは 'new Class()' と同等です。つまり、Class が実行され、結果が Person に割り当てられます。「new」キーワードで呼び出されるため、「this」は Class の新しいインスタンスに割り当てられます。
  3. さて、Class() の中で何が起こるでしょうか? (i) klass は関数に設定されています (そのジョブは呼び出されたときに「this」を初期化します) - まだ実行されていません。(ii) クラスのプロトタイプで init プロパティが定義されている。init プロパティは空の関数に設定されます (定義するクラスに応じて後で上書きします) (iii) klass の extend および include プロパティを使用したさらに複雑なもの (iv) そして klass が返されます -> klass はこれで関数定義を保持します時点。したがって、'new Class()' を呼び出すと、'klass' という関数が返されます。この関数は、呼び出されると、'this' の初期化を実行します。
  4. この時点での人間は、平たく言えば、「関数 klass()」を保持していると考えることができます。したがって、Person.extend はコードの klass.extend 部分に移動すると考えることができます。klass.extend は、オブジェクトを期待する関数です。このオブジェクトにはキーと値のペアがあり、キーはユーティリティ/関数の名前で、値は関数定義です。'for' ステートメント内で (var i in obj) を実行します - したがって、'i' にはキーが含まれます - 'klass.fn[i]' を実行するときは、klass.prototype.save または klass.prototype.destroy を意味します - 下付き文字なので[i] はドット表記(名前空間)と同じです。また、klass.prototype に追加されたメソッドは、プロパティとして Person に追加されるのではなく、Person のインスタンスで使用できることがわかっています。
  5. new Person() を呼び出します。この時点で Person は klass を保持しているため、実際には klass を実行しています。また、new がアタッチされているため、'this' が渡されます。ここで、'klass' 内で初期化が 'this' の init プロパティで行われます (適用フォームによる) -> そして、この 'init' プロパティを上書きしました。

    klass.fn.parent = クラス; //どこで使う? //どこにもありません。

于 2015-07-20T11:06:39.437 に答える