6

まず第一に、これがばかげた質問であるならば、すみません。以下に2つのコードスニペットを作成しました。ここから見つかった最初のコードスニペットは間違いなく彼によって書かれJohn Resig、間違いなく彼は最高の1つであり、2番目のコードスニペットは違いを理解するためだけに元のコードから私によって変更されていますが、実際には両方と私が何の違いがあるのか​​わかりません両方で比較的できることとできないこと。誰かが私に違いを理解するのを手伝ってください。ありがとう。

    function makeClass(){
        return function(args){
            if ( this instanceof arguments.callee ) {
                if ( typeof this.init == "function" )
                    this.init.apply( this, args.callee ? args : arguments );
                }
                else  return new arguments.callee( arguments );
        };
    }
    var User = makeClass();
    User.prototype.init = function(first, last){
      this.name = first + " " + last;
    };
    var user = User("John", "Resig");
    console.log(user);

修正版

    function myClass(args)
    {
        if (this instanceof arguments.callee) 
        {
            this.init = function(first, last){
                this.name = first + " " + last;
            };
            this.init.apply( this, args.callee ? args : arguments );
        }
        else    return new arguments.callee( arguments );
    }
    var obj = new myClass('Sheikh', 'Heera');
            console.log(obj);

コンストラクター内にメソッドを記述する代わりに、オブジェクトのプロトタイプを使用して(インスタンスを作成した後に)メソッドを追加する必要があるのはなぜですか?

4

1 に答える 1

7

コンストラクターではなくオブジェクトのプロトタイプでメソッドを定義する主な理由は、プロトタイプで定義されたメソッドが、オブジェクトのすべてのインスタンスで(メモリ内で)すぐに使用可能になり、共有されるためです。

コンストラクターでメソッドを定義することにより、そのメソッドは、それを作成するオブジェクトのインスタンスに固有になります。オブジェクトを10個インスタンス化すると、それらの1つを変更するまで、すべて同じであっても、メモリにメソッドのコピーが10個あります。

ただし、明確にするために、オブジェクトインスタンス間で共有することにより、メソッドがアクセスするすべてのプロパティに対して静的に動作するという意味ではありません。これらのプロパティ(で定義されてthis.いる場合)は、引き続きインスタンス固有です。同じメソッドの複数のコピーを定義することにならないというだけです。

于 2012-04-14T19:37:50.837 に答える