ホームページ  >  記事  >  ウェブフロントエンド  >  JSシミュレーション オブジェクト指向総合ソリューション(2.型と代入)_javascriptスキル

JSシミュレーション オブジェクト指向総合ソリューション(2.型と代入)_javascriptスキル

WBOY
WBOYオリジナル
2016-05-16 18:04:581018ブラウズ

型の割り当ては、変数の受け渡しの問題に似ています。
言うまでもなく、基本的なデータ型は値渡しです。

コードをコピーします コードは次のとおりです。

var a=5; b=a ;
b=3;
alert(a);//ヒント 5
alert(b);//ヒント 3

この観点から、変数の値は前後に渡され、変数自体とは何の関係もないため、b を変更しても a は変更されないことがわかります。
オブジェクトタイプ、パスバイアドレス。

コードをコピーします コードは次のとおりです。
var a=new Object(); 🎜>a.x =5;
var b=a;
b.x=3;
alert(a.x);//プロンプト 3
alert(b.x);//プロンプト 3


このように、アドレスの受け渡しにより、bはa、aはbとなり、相互に変化します。
まだ不明な場合は、別の例を示します:


コードをコピーします コードは次のとおりです:
var a=new Object();
a.x=5;
var b=a;
alert(b.x);//プロンプト 5、b.x は両方とも 5
a.x=3 ;// a.x を b.x に変更します。両方とも 3
alert(a.x);// プロンプト 3
alert(b.x);// プロンプト 3


ただし、オブジェクト タイプ 互いのプロパティへの値の割り当ては、オブジェクト タイプとは関係なく、むしろそのプロパティのタイプと関係があります。
属性が基本データ型の場合は値が渡され、属性がオブジェクト型の場合はアドレスが渡されます。たとえば、簡単にしてみましょう:


コードをコピーします コードは次のとおりです:
var a=new Object(); var b=new Object();
alert(a.x); (b.x); //ヒント 3


上記で前後に割り当てられているものは、両方とも互いに分離されており、基本的なデータ型にすぎません。値を相互に転送し、相互に影響を与えることはありません。



コードをコピーします
コードは次のとおりです。 var a=new Object(); 🎜>a.x =5; var b=a.x; alert(a.x);/prompt/5
alert(b);//prompt 3


これも同様で、b の基本データ型と a の基本データ型の属性 x は互いに影響を与えず、値を転送するだけです。他の。
ただし、オブジェクトのプロパティもオブジェクト型である場合、それらもアドレスによって渡されます。



コードをコピーします


コードは次のとおりです。
var a=new Object(); 🎜>a.x =new Object; a.x.n=5; var b=a.x; alert(b.n);//プロンプト 5 b.n=3;// これにより、a.x の n も変更されます。
alert(a.x.n);//プロンプト 3
alert(b.n);//プロンプト 3


オブジェクトの属性 x は、Object オブジェクト タイプとして定義されます。したがって、b に値 a.x が割り当てられている場合、それらは実際には同じものであり、相互に影響を与えたり、変更したりすることができます。
————
しかし、オブジェクト型変数に値を割り当てたい場合は、「あなたは私、私はあなた」という高貴な性格の領域に到達するのではなく、属性をコピーするだけです。 「生きるも死ぬも一緒」の。何をするか?
特に良い方法はありませんが、以下の関数を使用してください。



コードをコピー


コードは次のとおりです:
var DeepCopy = function(destination, source) { for (ソースの var プロパティ) { var copy = source[property]; if ( destination === copy ) continue; == " オブジェクト" )
{
destination[property] = DeepCopy(destination[property] || {}, copy);
else

; >}
戻り先 🎜>
コードは次のとおりです。 >var b=new Object;
DeepCopy (b,a);
alert(b.x);//プロンプト 5
alert(b.y);//プロンプト 3
b.x=8; >alert(a.x);//プロンプト 5


ほら、b.x を変更しても a.x には影響しませんよね?
この DeepCopy は良い機能です。
上記は、オブジェクト型のシミュレートされた「値による受け渡し」を実装しています。
では、基本的なデータ型の「アドレスによる受け渡し」をどのようにシミュレートできるでしょうか?
Array オブジェクトを使用するだけです。
コードをコピー コードは次のとおりです。

関数変更(a)
{
a[0]=5;
alert(a); // ヒント 5
}
var x=[3]; // ヒント 3
change( x);
alert(x); // ヒント 5

[xx] を割り当てることは、実際には Array オブジェクトにデータを割り当てることです。ここでは、1 つの要素を含む配列を使用してアドレス転送をシミュレートします。配列はオブジェクト型なので、渡す際はアドレスで渡します。
もちろん、任意のオブジェクト タイプのプロパティを使用してシミュレートすることもできます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。