Re: オブジェクト
すぎたです。
In message news:Fo9Na.134$FN4.59@news1.dion.ne.jp
"ITAHASHI Kunio" <kunitahashi@h2.dion.ne.jp> wrote ...
> function Regulat(Gas){
> this.srNr = Gas;
> }
>
> は
>
> function Regulat(Gas){
> this.Gas = Gas;
> }
>
> だと思いますが、たしかにおっしゃるとおりですよね。
ここがちょっと気になるのですが、プロパティ名と引数とは
関係は無く、引数の内容によって保存先を管理しているという
わけでも無いので、以下のようにしても可です。
function Regulat(a){
var b = a + ' gas';
this.c = b;
}
# 環境問題には疎い方なので srNr はなにか関連する略称かと
# 思っていたのですが、もしかして保存位置を識別するための
# シリアルナンバーとしてつけたのでしょうか?
実体のとらえかたですが、以下のように Object に全て関連付け
られて保存されるわけではなく、
Regulat
L srNr['12345'] = 'NOx'
L srNr['67890'] = 'COx'
中村さんもおっしゃっておられる通り、別個に管理されます。
これは JavaScript の場合、new することで複製が作成され、
その位置を変数に代入して利用しているようなイメージに
なります。
function Regulat(Gas) {
this.a = Gas;
}
var mater1 = new Regulat('NOx');
var mater2 = new Regulat('COx');
mater1 = Regulatの複製1の位置
L a = 'NOx'
mater2 = Regulatの複製2の位置
L a = 'COx'
なので、
mater3 = mater2;
とすると、mater2 を変更すると、参照先が同じなので mater3
でも同じ値となります。
mater2.a = 'ABC';
alert(mater3.a);
# 以下、参考まで。
この mater2 から複製を作る正当な手段は JavaScript では
提供されていないので、
var mater3 = new Regulat('ABC');
とするか、次善策として
var mater3 = new Regulat();
// Regulat()のコンストラクタに渡される引数は null か
// undefined になると思うので、まずい場合は適当な値を指定。
for (var i in mater3) {
// for in では、全てのプロパティが列挙されるわけでは
// ないので、部分的なコピーになる場合があります。
mater3[i] = mater2[i];
}
のようにする必要があります。
# 以下、参考その2
板橋さんが最初に考えられた、1つの管理領域でデータを扱いたい場合、
以下のようにするのも1つの手です。
(Gasベースで(重複するものがないとして)、関連するsrNrを参照する
場合なので、逆向きに対応付ける場合は、代入関係を逆にします)
Regulat
L datatbl : データを保存するための配列
L result : 実行結果を一時的に格納するための配列
(GetGas()実行で上書きされる)
L AddData(srNr,Gas) : Gas を識別子として、srNr を保存
(Gasが重複した場合、上書きされる)
L GetSrNr(Gas) : Gas を識別子として、srNr を取得
L GetGas (srNr) : srNr を識別子として、Gas を取得
(srNrは重複可として、結果を配列で取得)
<script>
function Regulat() {
this.datatbl = new Array();
this.result = new Array();
}
Regulat.prototype.AddData = function (srNr, Gas) {
this.datatbl[Gas] = srNr;
}
Regulat.prototype.GetSrNr = function (Gas) {
return this.datatbl[Gas];
}
Regulat.prototype.GetGas = function (srNr) {
// 一時保存用の result ではなく、個別のメモリ領域に保存
// したい場合は、ここで var result = new Array(); として、
// result[n++] = i; のようにすれば可能です。
var n = 0;
this.result.length = 0;
for (i in this.datatbl) {
if (this.datatbl[i] == srNr)
this.result[n++] = i;
}
return this.result;
}
var mater = new Regulat();
mater.AddData('12345', 'NOx');
mater.AddData('67890', 'COx');
alert(mater.GetSrNr('NOx'));
alert(mater.GetGas ('67890'));
</script>
--
杉田
sugi-nws@bk.iij4u.or.jp
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735