で、"12345" および "67890" を取得するにはどう
書けばよいのでしょうか。
いつも初歩的な質問で申し訳ありません。
--
板橋
[PS]あと、 「インスタンス」って、日本語でいうとしたらどういうのが
適当ですか。英和辞書を引いてみましたが、どの訳もイマイチ
ピンと来ませんでした。
> function Regulat(srNr, Gas)
> this.srNr = Gas;
> }
> mater1 = new Regulat('12345','NOx')
> mater2 = new Regulat('67890','COx')
> で、"12345" および "67890" を取得するにはどう
> 書けばよいのでしょうか。
mater1.srNrとmater2.srNrだと思うけど…
> [PS]あと、 「インスタンス」って、日本語でいうとしたらどういうのが
> 適当ですか。英和辞書を引いてみましたが、どの訳もイマイチ
> ピンと来ませんでした。
訳すなら「実体」かな。でもインスタンスとそのまま言うことの方が
多い気がします。
訳さないといけないのですか? 久野
function Regulat(srNr, Gas){
this.srNr = Gas;
}
mater1 = new Regulat('12345','NOx')
mater2 = new Regulat('67890','COx')
です。
いつもそそっかしくてすいません。
--
板橋
> > function Regulat(srNr, Gas)
> > this.srNr = Gas;
> > }
> > mater1 = new Regulat('12345','NOx')
> > mater2 = new Regulat('67890','COx')
> > で、"12345" および "67890" を取得するにはどう
> > 書けばよいのでしょうか。
「 { 」がないのはおいておくとして(後で補足されていますが)。
> mater1.srNrとmater2.srNrだと思うけど…
「this.srNr = Gas」なので、
mater1.srNr:NOx
mater2.srNr:COx
になると思うんですが........。
生成されたオブジェクト(mater1、mater2)から、生成元のコンストラクタ:
Regulat の arguments オブジェクトを呼ぶ方法(この方法を便宜上「(A)」と
します)があれば mater1、mater2 からでも「12345」、「67890」をコンストラ
クタを弄ることなく取得出来るとは思うんですが。そういう方法が思い浮かびま
せん。その方法を知っていらっしゃる方がいれば私にも教えて頂きたいです(実
はそれでずっと悩んでレス入れられませんでした)。
普通なら、
function Regulat(srNr, Gas) {
this.srNr = srNr;
this.Gas = Gas;
}
とかやって、
mater1 = new Regulat('12345','NOx')
mater2 = new Regulat('67890','COx')
とした後、
久野さんの書かれた様に
mater1.srNr
mater2.srNr
で良いんですが、(A)の方法がないとして、板橋 さんのコードのようにどうし
てもコンストラクタの第一仮引数:srNrに渡された第一実引数:012345を第二実
引数:NOx で上書きして、その状況下でインスタンスから上書きされる前の値を
取得したいのであれば、
function Regulat(srNr, Gas) {
this.arg = arguments;
this.srNr = Gas;
}
のようにして、
mater1 = new Regulat('12345','NOx');
mater2 = new Regulat('67890','COx');
でインスタンスを生成し、
mater1.arg[0];
mater2.arg[0];
で「12345」と「67890」が取得出来ると思います。
> > [PS]あと、 「インスタンス」って、日本語でいうとしたらどういうのが
> > 適当ですか。英和辞書を引いてみましたが、どの訳もイマイチ
> > ピンと来ませんでした。
> 訳すなら「実体」かな。でもインスタンスとそのまま言うことの方が
> 多い気がします。
私も訳すなら、「実体」ですね。鯛焼きを焼く鉄板(型取りの為の「雛型」)
がクラスで、それから作られる個々の鯛焼きが「実体」=インスタンスだと思い
ます。クラスはあくまで設計図です。そこから「形」になったものがインスタン
スです(クラスの静的メンバや静的メソッドはインスタンス化しなくても使えま
すが)。
意味が分かるのなら、久野さんの仰るように、インスタンスと呼んで良いので
はないでしょうか?
---------------------------------------
Hirotsugu Nakamura <CQE2...@nifty.com>
> > mater1.srNrとmater2.srNrだと思うけど…
> 「this.srNr = Gas」なので、
> mater1.srNr:NOx
> mater2.srNr:COx
> になると思うんですが........。
わ、そうですね。全然見間違えていました。^_^; 久野
ありがとうございました。
たしかにこの方法でできます。
>function Regulat(srNr, Gas) {
>this.arg = arguments;
>this.srNr = Gas;
>}
//のようにして、
>mater1 = new Regulat('12345','NOx');
>mater2 = new Regulat('67890','COx');
//でインスタンスを生成し、
>alert(mater1.arg[0]);
>alert(mater2.arg[0]);
//で「12345」と「67890」が取得出来ると思います。
なるほど、です。
かなり格闘したのですが、こいつがどうしても取り出せ
ませんでした。水面下でsrNrがGasを切り分けているの
は分かるのですが、それが陰で動いていて「実体」を表
わさなくて、不気味だったです。
できれば、持ち駒だけで取り出す「エレガントな」方法が
他にもあるのなら、それをぜひ知りたいです。
--
板橋
/^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^l
l 板橋さん(ITAHASHI Kunio)は、 l
l 日時:Fri, 4 Jul 2003 02:03:02 +0900 に、 l
l 件名:< Re: オブジェクト > l
l として送信されました。 l
l /
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 水面下でsrNrがGasを切り分けている
板橋さんの仰る、
水面下でsrNrがGasを切り分けている
とはどういうニュアンスでしょうか?
> 「実体」を表わさなくて、不気味だったです。
板橋さんの最初のコードでは、mater1、mater2共々、プロパティはひとつしか
持っていません。つまりsrNrだけです。逆にお聞きしたいのは、何故、ひとつし
かプロパティを持たないオブジェクト生成に、コンストラクタに引数をふたつも
とるのかということです。
function Regulat(Gas){
this.srNr = Gas;
}
mater1 = new Regulat('NOx');
mater2 = new Regulat('COx');
で良いものを、何故、new するときにふたつも引数を与えるのでしょうか?確か
に、
function Regulat(Gas){
this.srNr = Gas;
}
mater1 = new Regulat('NOx');
mater2 = new Regulat('COx');
mater1.num = '12345';
mater2.num = '67890';
と後からプロパティを追加することは出来ますが、それなら最初から
function Regulat(srNr, Gas) {
this.srNr = srNr;
this.Gas = Gas;
}
とかやって、
mater1 = new Regulat('12345','NOx')
mater2 = new Regulat('67890','COx')
でも良いと思うしこれが一番エレガントだと思うのですが……。
私が言いたいのは、「水面下でsrNrがGasを切り分けている」 の意味にもより
ますが、
function Regulat(srNr, Gas) {
this.srNr = Gas;
}
この時点で、既にコンストラクタの引数であるsrNrは存在価値がないと思うので
す。コンストラクタ引数であるsrNrとインスタンス変数である(thisのついた)
srNrは全く別物です。少なくともコンストラクタ内では、arguments がコンスト
ラクタ引数であるsrNrを保持していますが、オブジェクトとしてみた場合、コン
ストラクタ引数であるsrNrは一度も使われていません。そんな運命しかない引数
をコンストラクタに与える意味は何なのでしょうか?
> できれば、持ち駒だけで取り出す「エレガントな」方法が
> 他にもあるのなら、それをぜひ知りたいです。
コンストラクタを弄らないで済む方法ですよね?それをさっきから探していた
んですが力不足で........
---------------------------------------
Hirotsugu Nakamura <CQE2...@nifty.com>
/^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^l
l 私は、 l
l 日時:Fri, 04 Jul 2003 00:29:39 +0900 に、 l
l 件名:< Re: オブジェクト > l
l として送信しました。 l
l /
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> コンストラクタの第一仮引数:srNrに渡された第一実引数:012345を第二実
> 引数:NOx で上書きして、その状況下でインスタンスから上書きされる前の値を
> 取得したいのであれば、
012345 は NOx で上書きされていません。012345は「ただ使われていない」だ
けです。失礼しました。
---------------------------------------
Hirotsugu Nakamura <CQE2...@nifty.com>
In message news:HOVMa.105$FN...@news1.dion.ne.jp
"ITAHASHI Kunio" <kunit...@h2.dion.ne.jp> wrote ...
> function Regulat(srNr, Gas)
> this.srNr = Gas;
> }
> mater1 = new Regulat('12345','NOx')
> mater2 = new Regulat('67890','COx')
>
> で、"12345" および "67890" を取得するにはどう書けばよいのでしょうか。
代入されてないように思います。
なにをしたいかによりますが、取得するだけであれば
とりあえず両方代入しておいてはどうでしょうか。
function Regulat(srNr, Gas) {
this.srNr = srNr;
this.Gas = Gas;
}
mater1 = new Regulat('12345','NOx')
alert(mater1.srNr);
>> 水面下でsrNrがGasを切り分けている
> 板橋さんの仰る、
> 水面下でsrNrがGasを切り分けている
>とはどういうニュアンスでしょうか?
>
なにせ素人考えなので、真偽のほどはあやしいのですが、
function Regulat(srNr, Gas){
this.srNr = Gas;
}
mater1 = new Regulat('12345','NOx')
mater2 = new Regulat('67890','COx')
というコンストラクタとインスタンスをセットすると、
mater1.srNr // displays NOx
mater2.srNr // displays COx
ですよね。(以下、コメントアウトは実行結果を表わす)
プロパティが共通なのに実行結果はオブジェクトに応じ
てきちんと分けて取得できてる(みたいだ)。なんでかな、
と思ったわけです。それで、それはきっと、"12345" とか
"67990" が陰で糸を引いているにちがいない、と。でも、
決して表面には出て来ない。で、こいつらはどこで仕事し
てるんだろう、と思ってその居場所をあぶり出そうと思っ
たわけです。
でも、悲しいかな、いくらやっても初心者の私には彼らの
居場所を特定できない(居場所というのとはちょっと違うの
かもしれないんですが、私の素人感覚です)。
で、このコンストラクタの評価もかねてお伺いしようと思った
次第でした。実は、このコンストラクタは私が考えたもので、
教科書的な書き方はみなさんが書いていらっしゃるような
ものですよね。こちらの、構造はムダなようで、不可欠性
を内包しているというか、そんな気がしました。でも、中村
さんの説明を拝読して、それが違っていたような気がしてま
す。
は
function Regulat(Gas){
this.Gas = Gas;
}
だと思いますが、たしかにおっしゃるとおりですよね。私の
コンストラクタはちょっと変わっているというか、ヘンかも
しれません。これは、配列の発想がアタマにあるので、そう
したのだと思います。違っているかもしれませんが、その方
がコードを節約できるような気がして・・・。
いろいろありがとうございます。
--
板橋
/^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^l
l 板橋さん(ITAHASHI Kunio)は、 l
l 日時:Fri, 4 Jul 2003 15:46:41 +0900 に、 l
l 件名:< Re: オブジェクト > l
l として送信されました。 l
l /
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > 水面下でsrNrがGasを切り分けている
> >とはどういうニュアンスでしょうか?
> なにせ素人考えなので、真偽のほどはあやしいのですが、
> function Regulat(srNr, Gas){
> this.srNr = Gas;
> }
> mater1 = new Regulat('12345','NOx')
> mater2 = new Regulat('67890','COx')
> というコンストラクタとインスタンスをセットすると、
> mater1.srNr // displays NOx
> mater2.srNr // displays COx
> ですよね。(以下、コメントアウトは実行結果を表わす)
そうです。
> プロパティが共通なのに実行結果はオブジェクトに応じ
> てきちんと分けて取得できてる(みたいだ)。なんでかな、
> と思ったわけです。それで、それはきっと、"12345" とか
> "67990" が陰で糸を引いているにちがいない、と。でも、
> 決して表面には出て来ない。で、こいつらはどこで仕事し
> てるんだろう、と思ってその居場所をあぶり出そうと思っ
> たわけです。
クラスは設計図(雛型)だから、実体はありません(静的変数、静的メソッド
は別として)。このクラスから生成されるオブジェクトは、それぞれ「別物」な
んです(別のメモリ空間を持つ)。つまり、設計図は同じでも、それから生成さ
れたmater1とmater2は別物なんです。
「設計図が同じなら、何故生成されるオブジェクトのプロパティがそれぞれ異
なるんだ?」と思うかもしれません。ここでは人間を例にとってみましょう。
人間には、基本的に、性別・年齢等の性質(プロパティ)がありますよね?こ
の時、「人間には性別や年齢がある」という「人間に備わった特性」はクラスと
して定義可能ですよね?
ですが、そこから生成される個々の人間は、「誰もが性別や年齢というプロパ
ティを持」ちますが、全ての人間が女性ですか?男性ですか?全ての人間が20歳
ですか?30歳ですか?違いますよね?それぞれ男性だったり女性だったり、30歳
だったり40歳だったりするわけです。つまり個々の人間はそれぞれのプロパティ
を持っているんです。これはクラスから生成された「実体」としてのインスタン
スだからです。
function CPerson (sex, age)
{
this.sex = sex;
this.age = age;
}
があったとして、
var john = new CPerson('male', 25);
var lucy = new CPerson('female', 20);
としたとします。この時 john と lucy はオブジェクトですが、別のアドレスに
格納されているんです。別のアドレスに格納される以上、プロパティを保持する
領域も当然違うわけで、だからこそ、プロパティが同じでもオブジェクトごとに
違う値が得られるのです(みな同じならオブジェクト指向自体意味のない概念に
なってしまいます)。
それが、
> プロパティが共通なのに実行結果はオブジェクトに応じ
> てきちんと分けて取得できてる
理由です(実際は仮想メモリというのがあるのですが、この話をするとややこし
くなるので割愛します)。少なくとも、
> それはきっと、"12345" とか "67990" が陰で糸を引いている
のではありません。12345や67890はオブジェクトを識別するのに何の役にも立っ
ていないのです。
そして12345や67890は何の意味もない上、実際にオブジェクト生成で一切使わ
れていないので、
> 決して表面には出て来ない。
のです。
> で、こいつらはどこで仕事してるんだろう、と思ってその居場所を
> あぶり出そうと思ったわけです。
使われていないので居場所はありません(コンストラクタでの、arguments には
格納されますが)。
C/C++ 等の様な、変数や(オブジェクト指向での)オブジェクトのアドレスを
直接参照出来る言語なら、それぞれの変数やオブジェクトが別々のアドレスに格
納されていることが良く分かります。
また、オブジェクトも結局は変数なのです。クラスという「型」から作られた
変数なのです。ただ他の変数と違い、プロパティやメソッドにアクセス出来ると
いう特性があるというだけです。
> でも、悲しいかな、いくらやっても初心者の私には彼らの
> 居場所を特定できない(居場所というのとはちょっと違うの
> かもしれないんですが、私の素人感覚です)。
元々mater1やmater2では12345や67890は使われていないので特定出来ません。
> function Regulat(Gas){
> this.srNr = Gas;
> }
> は
> function Regulat(Gas){
> this.Gas = Gas;
> }
> だと思いますが、
えっと、これは
function Regulat(Gas){
this.srNr = Gas;
}
でも、
function Regulat(Gas){
this.Gas = Gas;
}
でも同じです。必ず
function Regulat(Gas){
this.Gas = Gas;
}
にしなくてはならないのではなく、クラス設計者(この場合板橋さん)がプロパ
ティにどのような意味を持たせるかという「設計思想」による違いでしかありま
せん。確かに
function Regulat(Gas){
this.Gas = Gas;
}
の方が素直なコードですが、あくまで板橋さんが一番最初に提示されたコードで
function Regulat(srNr, Gas){
this.srNr = Gas;
}
とされてたので、
function Regulat(Gas){
this.srNr = Gas;
}
としたまでです( this.srNr には Gas を代入しているし、コンストラクタの引
数には srNr は使われてないので)。
> 配列の発想がアタマにあるので、そうしたのだと思います。
配列の発想というよりも、オブジェクト指向的な考えがまだ身に付いていらっ
しゃらないからだと思います。
---------------------------------------
Hirotsugu Nakamura <CQE2...@nifty.com>
In message news:Fo9Na.134$FN4...@news1.dion.ne.jp
"ITAHASHI Kunio" <kunit...@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>