4

だから私はMootoolsが内部でどのように機能するかを学ぶことによってjavascriptを学ぼうとしています。私はこれらの行を具体的に見ています:

var Type = this.Type = function(name, object){
    if (name){
        var lower = name.toLowerCase();
        var typeCheck = function(item){
            return (typeOf(item) == lower);
        };

        Type['is' + name] = typeCheck;
        if (object != null){
            object.prototype.$family = (function(){
                return lower;
            }).hide();

        }
    }

    if (object == null) return null;

    object.extend(this);
    object.$constructor = Type;
    object.prototype.$constructor = object;

    return object;
};

//some more code

new Type('Type',Type);

ここで何が起きてるの?

一番下のコンストラクターステートメントで割り当てられているオブジェクト、グローバルウィンドウオブジェクトは何ですか?

Type関数が新しいオブジェクトを作成するのではなく、渡されたオブジェクトのみを更新するように見えるのに、なぜそれがnewステートメントでコンストラクターとして呼び出されるのですか?

具体的には、行object.extend(this);の「this」とは何ですか。?それはグローバルウィンドウオブジェクトですか?そうであれば、そのオブジェクトのすべてのキーと値のペアをTypeオブジェクトに追加しますか?

4

1 に答える 1

3

シーシュ、最近の質問はmootoolsの内部にもっと焦点を当てているようです。

私はコア開発者ではないので、私の知識の限りでは答えます。

TypeMooToolsのはClassに非常に似ていますが(実際、Classコンストラクター自体はTypeです)、データ/値と値のタイプに重点を置いています。また、ECMA仕様で定義されているネイティブタイプを拡張し、より柔軟にすることも目的としています。

String一般的なデータ型( 、、、、Numberなど)Arrayについて話すのは意味がないと思いますObject。なぜそれらを拡張する必要があるのですか?さて、初心者にとって、ダクトタイピングはjsでは少し風変わりです。typeof {}; // object、、typeof []; // objectなどtypeof new Date(); // object-すべての型がオブジェクトから継承され、それらをグループ化するのが論理的である場合でも、最も役立つわけではありません。コードの記述には役立ちません。

したがって、jsオブジェクトのコンテキストでは、コンストラクターオブジェクトから作成されます...

Typeが行うことは、コンストラクター関数を置き換えることではなく、新しいメソッドまたはプロパティを追加することによって既存のコンストラクターを変更することです。

例えば。new Type('Array', Array);

これにより、ネイティブの配列コンストラクターが一種の型オブジェクトに変わります。結果などを保存する必要はありません。これは、元の操作を変更し、操作のために開いたままにする1回限りの操作です。

typeOf(Array); // type

それで、何が違うのですか?さて、初心者にとってtypeOf([])は、実際にそれが実際に何であるかを私たちに伝えることができるようになりました- array。そして、ここで実際に起こることはこれです:object.extend(Type);、魔法のビット。Typeオブジェクトで定義されているすべてのプロパティをターゲットオブジェクトにコピーします。これらは次の場所で確認できます。

https://github.com/mootools/mootools-core/blob/master/Source/Core/Core.js#L211-232

したがって、すぐに、新しく作成されたタイプはすべての重要なimplementメソッドを取得しextendます。

さらに高度な方法として、ネイティブの配列コンストラクターに基づく新しい型を作成しましょう。

var foo = new Type('foo', Array),
    a = new foo();
// it's a real boy!
a.push('hi');
// ['hi'], foo, object
console.log(a, typeOf(a), typeof a);

しかし、カスタムタイプが必要な場合はどうなりますか?魔法のような特別なものですか?引数2は実際には(匿名)関数である可能性があるため、問題ありません。

var Awesome = new Type('awesome', function(name, surname) {
    // console.log('I R teh construct0r!'); 
    this.name = name;
    this.surname = surname;
});

// extend it a little.
Awesome.implement({
    getName: function() {
        return this.name;
    },
    getSurname: function() {
        return this.surname;
    }
});

var Dimitar = new Awesome('dimitar', 'christoff');
console.log(typeOf(Dimitar)); // awesome
console.log(Dimitar.getName()); // dimitar

別の例では、DOMEventを見てください。上記を採用し、より高速でスリムなオブジェクトタイプにします。https://github.com/mootools/mootools-core/blob/master/Source/Types/DOMEvent.js#L21

では、なぜそれはクラスではないのですか?なぜなら、クラスはより高価であり、イベントは常に発生するからです。

これがお役に立てば幸いです。より詳細な説明については、メーリングリストで質問し、最高のものを期待してください。おそらく、コア開発者はあなたの標準ではないので時間がかかるでしょう。「アコーディオンを機能させるにはどうすればよいですか」タイプの質問...

于 2012-06-11T22:24:10.937 に答える