0

この質問は、イェフダ・カッツによるこの記事から着想を得ています。 関連する部分はこれです:

オブジェクト指向プログラミングを容易にするために、JavaScriptでは、新しいオブジェクトに使用するプロトタイプと呼び出すコンストラクター関数の組み合わせとしてFunctionオブジェクトを使用できます。

var Person = function(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}

Person.prototype = {
  toString: function() { return this.firstName + ' ' + this.lastName; }
}

ここでは、コンストラクター関数であり、新しいオブジェクトのプロトタイプとして使用するオブジェクトでもある単一のFunctionオブジェクトがあります。

コンストラクターとして機能するFunctionオブジェクトとプロトタイプが違うように見えるので混乱しています。これは、chromeからの次のコンソール出力から明らかです。

クロームコンソール出力

つまり、コンストラクター関数は、firstNameとlastNameの2つの引数を持つ上記の関数オブジェクトです。一方、プロトタイプは、たまたま1つのプロパティ(toString)を持つ通常のオブジェクトであり、これは別の関数オブジェクトによって定義されます。function() { return this.firstName + ' ' + this.lastName; }

私は彼の言っていることを誤解していますか、それとも記事は間違っていますか?

4

1 に答える 1

1

はい、それは正しくありません。新しいオブジェクトに使用されるプロトタイプは.prototype、オブジェクトの作成時にコンストラクター関数のプロパティによって参照されるプロトタイプです。これは、コンストラクター関数とは別のプレーンオブジェクトです。

function Person() {

}

var a = new Person(); //a.__proto__ is assigned Person.prototype

Person.prototype = {}; //This doesn't affect a, because .__proto__ was assigned at creation time

var b = new Person(); //b.__proto__ is assigned Person.prototype, which is just the random object we created with {}
于 2012-12-22T10:39:00.820 に答える