:person1.valueOf()このメソッドは呼び出されたオブジェクトの値を返します。valueOf()メソッドがあるかどうかをチェックします。プロトタイプチェーンでメソッドとプロパティがオブジェクト間でコピーされていないことを繰り返しておきたいと思います。オブジェクトのプロトタイプオブジェクトに直接アクセスする正式な方法はありません。仕様で[[prototype]]と呼ばれる内部プロパティで定義されています。いう名前のプロパティがあります。person1.__proto__とperson1.__proto__.__proto__を実行すると、コード内のチェーンの様子を見ることができます。介してオブジェクトのプロトタイプオブジェクトに間接的にアクセスできます。Objectリファレンスページを見ると、左側に多数のプロパティとメソッドが表示されます。上のスクリーンショットでperson1オブジェクトで使用できた継承されたメンバーの数を超えています。いくつかは継承されており、一部は継承されていません。定義されているものです。Object.prototype.で始まるもので、単にObject.で始まるものではありません。prototypeプロパティの値は基本的にプロパティとメソッドを格納するためのバケットであり、プロトタイプチェーンのさらに下にあるオブジェクトによって継承されることが期待されるオブジェクトです。したがって、Object.prototype.watch()、Object.prototype.valueOf()などは、コンストラクタから作成された新しいオブジェクトインスタンスを含め、Object.prototypeを継承するすべてのオブジェクトタイプで使用できます。prototypeバケット内で定義されていない他のメンバーは、Object.prototypeから継承したオブジェクトインスタンスまたはオブジェクト型に継承されません。これらは、Object()コンストラクタ自体で使用できるメソッド/プロパティです。関数もオブジェクトの一種です。あなたが私たちを信じていない場合は、Function()コンストラクタリファレンスを参照してください。既存のプロトタイププロパティを自分でチェックアウトすることができます。前の例に戻り、JavaScriptコンソールに次のように入力してみてください。結局のところ、私たちはカスタムコンストラクタのプロトタイプで何も定義していません!デフォルトでは、コンストラクタのprototypeは常に空になります。次に、以下を試してみましょう:Object.prototypeObjectのprototypeプロパティで定義された多数のメソッドが表示されます。これらのメソッドは、前述のようにObjectから継承したオブジェクトで使用できます。JavaScript上のプロトタイプチェーン継承の他の例を見ることができます。String、Date、Number、Arrayのグローバルオブジェクトのプロトタイプで定義されたメソッドやプロパティを探してみてください。これらはすべて、プロトタイプで定義されたメンバーがいくつかあります。これは、たとえば、次のような文字列を作成する場合です。string.';myStringには、split()、indexOf()、replace()などの便利なメソッドが多数用意されています。このセクションを理解し、もっと詳しく知りたいとき、JavaScriptでプロトタイプを使用するための詳細なガイドを読むことは価値があります。このセクションは、最初に会ったときに理解しやすいように意図的に簡素化されています。prototypeプロパティは、JavaScriptの最も混乱した部分の1つです。(__proto__でアクセスできる内部オブジェクトです。prototypeは継承するメンバを定義するオブジェクトを含むプロパティです。先ほどObject.create()メソッドを使用して新しいオブジェクトインスタンスを作成する方法を示しました。Object.create(person1);create()が実際に行うことは、指定されたプロトタイプオブジェクトから新しいオブジェクトを作成することです。ここではperson1をプロトタイプオブジェクトとして使用してperson2を作成しています。これを確認するには、コンソールに次のように入力します。person2.__proto__person1を返します。コンストラクタのプロパティすべてのコンストラクタ関数にはprototypeプロパティがあり、その値はconstructorプロパティを含むオブジェクトです。プロパティは、元のコンストラクタ関数を指し示します。コンストラクタを使用して作成されたすべてのインスタンスオブジェクトで使用できるようになります。両方のオブジェクトで使用できます。次のコマンドをコンソールで試してみてください。person1.constructorperson2.constructorこれらのインスタンスには元の定義が含まれているため、両方ともPerson()コンストラクタを返す必要があります。巧妙なトリックは、constructorプロパティの末尾にかっこを入れて(必要なパラメータを含む)コンストラクタから別のオブジェクトインスタンスを作成できることです。結局のところ、コンストラクタは関数なので、かっこを使用して呼び出すことができます。この関数をコンストラクタとして使用することを指定するには、newキーワードを含める必要があります。climbing']);次に、新しいオブジェクトの機能にアクセスしてみましょう。person3.name.firstperson3.ageperson3.bio()これはうまくいきます。頻繁に使用する必要はありませんが、新しいインスタンスを作成したい場合や、何らかの理由で簡単に利用できる元のコンストラクターへの参照がない場合は本当に便利です。constructorプロパティには他の用途もあります。オブジェクトのインスタンスがあり、そのインスタンスであるコンストラクタの名前を返す場合は、次のようにします。(プロトタイプの継承、バインディング、プリプロセッサ、トランスパイラなどのため)。プロトタイプの変更コンストラクタ関数のprototypeプロパティを変更する例を見てみましょう(プロトタイプに追加されたメソッドは、コンストラクタから作成されたすべてのオブジェクトインスタンスで使用可能です)。oojs-class-further-exercises.htmlの例に戻り、ソースコードのローカルコピーを作成します。now!');};コードを保存してブラウザにページを読み込み、テキスト入力に次のように入力してみてください:person1.farewell();コンストラクタ内部で定義された人の名前を特徴とする警告メッセージが表示されます。これは本当に便利ですが、さらに便利なのは、継承チェーン全体が動的に更新され、コンストラクタから派生したすべてのオブジェクトインスタンスでこの新しいメソッドを自動的に利用できることです。これについて少し考えてみてください。コードではコンストラクタを定義し、次にコンストラクタからインスタンスオブジェクトを作成し、コンストラクタのプロトタイプに新しいメソッドを追加します。now!');};しかし、person1オブジェクトインスタンスではまだfarewell()メソッドを使用できます。利用可能な機能は自動的に更新されます。(ライブ実行も参照してください)。このように定義されているとあまり柔軟ではないので、prototypeプロパティで定義されたプロパティはめったにありません。次のようなプロパティを追加できます。Smith';これは人がそう呼ばれないかもしれないので、あまり柔軟ではありません。this.name.last;ただしこれは機能しません。thisは、この場合はグローバルスコープであり、関数スコープではありません。undefinedが返されます。これは、プロトタイプの前半で定義したメソッドでうまく機能しました。これは関数スコープ内にあるため、オブジェクトインスタンススコープに正常に転送されます。定数プロパティを定義することもできますが、一般にコンストラクタ内でプロパティを定義する方が効果的です。実際、より多くのオブジェクト定義のためのかなり一般的なパターンは、コンストラクタ内のプロパティとプロトタイプのメソッドを定義することです。これにより、コンストラクタにはプロパティ定義のみが含まれ、メソッドは別々のブロックに分割されるため、コードを読みやすくなります。Zalewaの学校計画のアプリの例で実際に見られます。まとめこの記事では、プロトタイプオブジェクトのチェーンによってオブジェクトが互いに機能を継承できるようにする方法、プロトタイプのプロパティ、コンストラクタにメソッドを追加する方法、およびその他の関連トピックを含むJavaScriptオブジェクトのプロトタイプについて説明しました。次の記事では、独自の2つのカスタムオブジェクトの間で機能の継承を実装する方法について説明します。inbox.現在、ニュースレターは英語でのみ提供されています。従って私の個人情報を扱うことに同意します。