ホームページ  >  記事  >  ウェブフロントエンド  >  js を使用してプロトタイプの属性を変更する入門_JavaScript スキル

js を使用してプロトタイプの属性を変更する入門_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 17:02:141232ブラウズ

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 での転送はすべて値によるものです。この値は参照型へのポインターであるため、等号は参照オブジェクトを変更することを意味するのではなく、元の参照関係を切り替えることを意味します。この問題については、コードを通じて以下で説明します。 🎜>

コードをコピーします コードは次のとおりです: var obj=new Object(); name = "obj";
関数changeObj(o){
o.name = "変更";
o.name = "newObj";
}
changeObj(obj);

document.write(obj.name); //changedObj メソッド内で o=new Object()パラメータ o の値は変更されませんが、元の参照関係が切断されるため、結果は newObj ではなく変更されます

次に、最初の例のプロトタイプの friends 属性の変更をテストします。属性は参照型です



コードをコピー


コードは次のとおりです:
p1.friends。 Push("c") ; document.write(p1.friends "
") //a,b,c document.write(p2.friends "
;"); // a,b,c
p1.friends=["x","y","z"];
document.write(p1.friends "
"); / /x,y,z
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 はプロトタイプで定義されるべきではありません。ここでのコード例は、この知識点を説明するだけであり、実際的な意味はありません)。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。