コードや図の最初の部分
関数人(){} Person.prototype.name = "NIC" Person.prototype.age = 22 Person.prototype.job = "ソフトウェアエンジニア" Person.prototype.sayName = 関数(){ アラート(この.nameの) } VAR PERSON1 = 新しい人(); VaRの PERSON2 = 新しい 人(); 警告(person1.sayName == person2.sayName) // 真
図1
彼は、トピックを入力し始めました
どんなに限り、新しい関数の作成など、それは特定の規則に従ってプロパティ関数のプロトタイプを作成しません何時、この属性は、関数のプロトタイプオブジェクトを指します。デフォルトでは、すべてが自動的protopypeプロパティは、上記のコードであるPerson.prototype.constructorポイント人を取る関数へのポインタであるプロトタイプオブジェクトのコンストラクタ(コンストラクタ)プロパティを得ます。このコンストラクタを通して、私たちは、追加のプロトタイプオブジェクトのプロパティとメソッドを追加し続けることができます。
あなたはデフォルトコンストラクタのプロパティを取得しますそのプロトタイプオブジェクトのカスタムコンストラクタを作成した後、他の方法についてはObjectから継承されます。コンストラクタへの呼び出しの新しいインスタンスを作成する場合、この例の内部ポインタ(内部プロパティ)が含まれ、点コンストラクタのプロトタイプは、[[プロトタイプ]]と呼ばれるES5管ポインタ属性。そこスクリプトアクセス[[プロトタイプ]]には標準はないが、Firefoxの、サファリでは、クロムは、各オブジェクト_proto_のプロパティをサポートしていますが、プロトタイプ・オブジェクト・インスタンスの間で、接続コンストラクタに存在しません例としては、コンストラクタの間に存在します。図1は、種々のオブジェクト間の関係を示します
コードの再度ピース
機能{)(人数 } Person.prototype.name = "NIC" Person.prototype.age = 29 VAR PERSON1 = 新しい新規人物() VaRの PERSON2 = 新しい新規人物() person1.name = "グレッグ" アラート(person1.name) / / 例から"グレッグ" の警告(person1.name) // "NIC"のプロトタイプから削除person1.name アラート(person1.name) // から"NIC"のプロトタイプを
コードは、上述したプロトタイプの値にオブジェクト・インスタンスを介してアクセスすることができるが、オブジェクトのインスタンスのプロトタイプの値を書き換えることはできません。我々は属性を追加し、プロトタイプオブジェクトの属性と同じ属性名ならば、我々は、このインスタンスにプロパティを作成し、プロトタイプのシールド特性ということだろう、属性は、削除してインスタンスを削除することができ、その者が再訪しましょうプロトタイププロパティ
私たちは、コードの一部を戻ってきてみよう
関数者(){ } VARの友人= 新しい人() Person.prototype.sayHi = 関数(){ 警告( "こんにちは" ) } friend.sayHi() // "こんにちは"(没有问题!) Person.prototype = { コンストラクタ:人、 名前: "NIC" 、 sayHi:機能(){ 警告(この.nameの) } } friend.sayHi() // "こんにちは"(还是"こんにちは")
上記のコードは2つのことを示します
1.インスタンスとプロトタイプとの間の関係は緩く(firend.sayHiを呼び出している)最初の例を探しますインスタンスとプロトタイプとの間の接続は単なるポインタではなくコピーであるため、我々は、プロトタイプが検索に行く見つけることができませんでしたしたがって、プロトタイプの更新が可能なsayHiの財産であり、
2.私たちはそうではありません全体のプロトタイプオブジェクトを書き換えた場合。私たちは、それが最初のプロトタイプのインスタンスへのポインタを追加します知っているあなたは、コンストラクタを呼び出して、変更する場合は[[プロトタイプ]]は、別のオブジェクトへのプロトタイプは、コンストラクタと初期のプロトタイプとの間のリンクを切るに等しいです
フィギュア
プロトタイプオブジェクトを書き換える前に、
図2
プロトタイプオブジェクトを書き換えた後、
図3