1

私が学んでいる本には、次のコードがオブジェクトを作成していると書かれていますが、これがどのように機能するかはわかりません。コードの 2 番目のセクションは、オンライン チュートリアルから学んだ別の方法です。しかし、違いは何ですか?私はこれを自分で調査しようとしましたが、これらすべてと私が理解できない説明のいくつかにまったく慣れていません. それぞれを使用する利点/欠点はありますか? 前もって感謝します。

function Player (name , score , rank)
{
this.name = name ;
this.score = score ;
this.rank = rank ;
}
var playerOne = new Player ( "Craig" , 199 , "1st" ) ;

以下は、私が以前に行った方法です。

var playerOne = {name: "Craig" , score: 199 , rank: "1st"} ;
var playerTwo = {name: "Tohny" , score: 155522 , rank: "2nd"} ;
4

4 に答える 4

4

主な違いは、最初のものは「プロトタイプ チェーン」に余分なオブジェクトがあることです。プロトタイプ チェーンは、JavaScript で継承を行う方法です。

したがって、そのオブジェクトを拡張することができ、コンストラクター関数から作成されたすべてのオブジェクトはPlayerそれらの項目を継承します。

function Player (name , score , rank)
{
this.name = name ;
this.score = score ;
this.rank = rank ;
}

Player.prototype.getNameRank = function() {
    return this.name + ":" + this.rank;
};

var playerOne = new Player ( "Craig" , 199 , "1st" ) ;

そのため、オブジェクトはメソッドplayerOneを継承しますがgetNameRank()、オブジェクト リテラル構文を使用して作成された他のオブジェクトは影響を受けません。

var nr = playerOne.getNameRank();

console.log(nr); // Craig:1st

JavaScript で作成したすべての(ほとんどの場合)Object.prototypeオブジェクトは、そのオブジェクトから継承されます。2 番目の例のオブジェクト リテラル構文には、プロトタイプ チェーンの背後にそのオブジェクトとそのオブジェクトのみがあります。

コンストラクターからのオブジェクトには、最初に がPlayer.prototypeあり、次にObject.prototype.

于 2013-10-29T17:51:13.687 に答える
0

しかし、違いは何ですか?

1 つ目はコンストラクター関数を使用し、2 つ目はオブジェクト初期化子を使用します。

それぞれを使用する利点/欠点はありますか?

はい:

  • コンストラクター関数は再利用でき、ロジックを組み込むことができるため、同じ特性を持つ複数のオブジェクトを作成する必要がある場合に適しています。また、オブジェクトを作成するコードが適切で含まれているため、一連のコードを記述した後でこれらの特性を変更する必要がある場合に特に適しています。
  • コンストラクター関数は、作成するオブジェクトにプロトタイプを割り当てることができます。プロパティを に配置するとPlayer.prototype、 を介して作成されたオブジェクトからこれらのプロパティにアクセスできますnew Player。これらのオブジェクトは、作成時に割り当てられるプロトタイプによってバックアップされるためです。オブジェクト初期化子ではそれを行うことはできません。(オブジェクト初期化子と ECMAScript5 のObject.create.
  • オブジェクト初期化子は、作成している各プロパティの名前を確認できるため、使用時に明示的でかなり明確ですが、コンストラクター関数への引数はそれらを指定した順序に基づいているため、より少なくなる可能性があります。オブジェクトを作成している時点でクリアします (たとえば、コンストラクター関数を使用)。実際、オブジェクトを引数として受け取り、そのオブジェクトのプロパティを使用して、作成中のオブジェクトに値を設定するコンストラクタ関数を目にすることがあります。
于 2013-10-29T17:52:03.107 に答える
0

JavaScript でオブジェクトを作成するには、2 つの方法があります。

  1. 関数コンストラクター (new キーワードと組み合わせて)
  2. オブジェクト リテラル (2 番目に示す方法)。

しかし、実際には、2 番目の方法は次の代替構文にすぎません。

var playerOne = new Object();
playerOne.name = "Craig";
playerOne.score = 199;
playerOne.rank = "1st";
// ...
于 2013-10-29T17:52:45.067 に答える
0

最初のコード例はコンストラクターです。私が理解していることから、そのオブジェクトのパラメーターとメンバーは既に定義されているため、オブジェクトを作成するより強く型付けされた方法です。

2 番目のコード例同じことを行いますが、オブジェクトが実際に何を含むべきか、またはどのように動作するべきかを定義するものは何もありません。これは必ずしも悪いことではありませんが、状況によってはあまり好ましくなく、コンストラクターほどの汎用性が得られません。

于 2013-10-29T17:51:05.317 に答える