混乱の原因は次のとおりです。
function foo {
this. name = 'foo';
}
alert(foo.prototype === Function.prototype ); 当時は、なぜ foo のプロトタイプが Function.prototype ではなかったのか理解できませんでした。
次の例では、o.prototype === Function.prototype が true であることが当然だと考えています。
function foo() {
this.name = 'foo'>}
Function .prototype.sayHello = function (parent) {
alert('hello');
foo.sayHello(); // アラート 'hello'
Function.prototype がsayHello メソッドを追加した後に与えると、foo もプロトタイプから SayHello を取得します。デバッガーで観察し、情報 (ECMA-262 http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/ および「JavaScript の良い部分」第 5 章 5.1 疑似古典を含む) を確認したところ、foo.prototype の定義が見つかりました。
this.prototype = {constructor: this}; //ここでは foo.prototype = {constructor: foo};
ちなみに次のようなテストを行いました
alert(foo = == foo.prototype.constructor); //true
foo.prototype とは何ですか?これは新しいキーワードと密接に関係しています。 new foo() が何をするかについて話してください。
var obj = {}; //新しいオブジェクトを定義します
obj.[[prototype]] == this.prototype;
//注 1: これは foo、foo.prototype です。これは便利です。obj のプロトタイプに値を割り当てます。ここでは、[[prototype]] を使用してプロトタイプを表します
//注 2: obj にはプロトタイプ属性がないため、おそらく役に立ちません
var other = this.apply(obj, argument); // obj.name = 'foo' とする、つまり、obj は this として実行されます。 foo function
return (typeof other === 'object' && other) || that ; // foo 関数がオブジェクトを返す場合はオブジェクトを返し、それ以外の場合は obj を返します。
これにより、 new foo() の場合、 foo がオブジェクトを作成してそのコンストラクターとして機能し、 foo.prototype が新しいオブジェクトのプロトタイプとして使用されることが非常に明確になります。
foo.prototype は、Function.prototype を変更することを恐れることなく、任意のメソッドを追加したり、任意のオブジェクトに変更したりできます (Function.prototype はすべての関数のプロトタイプです);
this.prototype = {constructor: this}; foo.prototype を手動で指定しなくても、js は new によって作成された新しいオブジェクトのデフォルトのプロトタイプを指定します。