JavaScript では、プロトタイプは、特定の型のすべてのインスタンスがアクセスできるプロパティとメソッドを定義します。メソッドが間違っていると、予期しない状況が発生します。 (オブジェクトのみです。私のような初心者は苦労します)、この部分の知識をテストを通じて簡単にまとめてみましょう。
基本型は次のように定義されます:
function person(){}
person.prototype={
コンストラクター:人物、
名前:"人物"、
年齢:100、
友達: ["a"," b"],
getName:function(){
return this.name;
}
};
2 つの Person インスタンスを定義し、 name 属性を変更します (この属性はプロトタイプで定義されています)。テスト コードは次のとおりです。
var p1=新しい人();
document.write(p1.name "
"); //人
document.write(p2.name "
"); //人
p1.name="p1";
document.write( p1.name "
"); //p1
document.write(p2.name "
"); //person
document.write(p1) .hasOwnProperty("name") "
"); //true はオブジェクトに属します
document.write(p2.hasOwnProperty("name") "
"); /false はプロトタイプに属します
document.write(Object.keys(p1) "
"); //name
document.write(Object.keys(p2) "< ;br/>gt;"); // 空の
document.write(Object.getOwnPropertyNames(Person.prototype) "
"); // コンストラクター,名前,年齢,友達,getName
document.write(person.prototype.name "< ;br/>"); //person
テスト後、p1.name="p1" はname の値ですが、インスタンス p1 に新しい name 属性を追加します。 その後の判断から、p1 の name 属性はすでにプロトタイプ属性ではなくインスタンス属性であることがわかります。 (p1) には、p1 のインスタンスが多数あることがわかりますが、p2 にはありません。 js での転送はすべて値によるものです。この値は参照型へのポインターであるため、等号は参照オブジェクトを変更することを意味するのではなく、元の参照関係を切り替えることを意味します。この問題については、コードを通じて以下で説明します。 🎜>
関数changeObj(o){
o.name = "変更";
o.name = "newObj";
}
changeObj(obj);
document.write(obj.name); //changedObj メソッド内で o=new Object()パラメータ o の値は変更されませんが、元の参照関係が切断されるため、結果は newObj ではなく変更されます
次に、最初の例のプロトタイプの friends 属性の変更をテストします。属性は参照型です
コードをコピー
コードは次のとおりです:
document.write(p2.friends "
"); //a,b,c
document.write(p1 .hasOwnProperty("friends" ) "
"); //true はオブジェクトに属します
document.write(p2.hasOwnProperty("friends") "
") / /false はプロトタイプに属します
document.write(Object.keys(p1) "
"); //name,friend
document.write(Object.keys(p2) "
"); //Empty
document.write(Object.getOwnPropertyNames(Person.prototype) "
"); //コンストラクター,名前,年齢,友達,getName
document.write(person.prototype. friends "
"); //a,b,c
このテストの結果は、基本的に最初のテストと同じです。等号で変更すると、元の参照を切り取ってインスタンスの新しい属性を作成し、プロトタイプ内の同じ名前の属性を上書きします
これら 2 つのテスト結果に基づいて、次のことがわかりました。プロトタイプの値 type 属性はインスタンス内で直接変更できないこと (もちろん、この値 Type はプロトタイプで定義されるべきではありません。ここでのコード例は、この知識点を説明するだけであり、実際的な意味はありません)。