忍者ブログ

Powered by 
NinjaBlog

[1][2][3][4][5][6][7][8]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

この記事のURL

...2024.11.23 17:25

プロパティとオブジェクトの関係

オレのためのJavaScript入門、その1

 まず以下にサンプルコードを挙げる(一部)。

ry)...
桃月学園.レベッカ宮本 = new Object();
桃月学園.レベッカ宮本.通称 = 'ベッキー';
桃月学園.レベッカ宮本.特徴 = new Array('天才', 'ハーフ');
...(ry

 ここではグローバルオブジェクト桃月学園レベッカ宮本プロパティにオブジェクトを定義している。
 ここでプロパティレベッカ宮本に保存されるのはnew Object()で生成されるオブジェクトへの参照である。より具体的に言うとレベッカ宮本プロパティの下に定義されるプロパティ群を持つもの(=オブジェクト)のJavaScript内部における保存先の名前である。この名前はJavaScript内部でこのオブジェクトが使われる際のタグとして利用される。そしてプログラマは、彼がレベッカ宮本と名付けて定義したオブジェクトがJavaScript内部で何と呼ばれているかを知ることはできない。
 このようにプロパティレベッカ宮本とここで定義されたオブジェクトとの結びつきはJavaScript内部では間接的なものである。一般的にオブジェクトを扱う言語では大抵このような仕様になっている。
 なぜこのような一見無駄に思える複雑な仕様になっているのかといえば、そうすることによる利点がそれなりにあるからで、また、そうした方が実装がラクだから、ということも理由の一つかもしれない。ただこのような仕様であるがために話がややこしくなってしまう場合があるのもまた事実である。

 具体的な例を挙げよう。上のサンプルコードにおいて、レベッカ宮本プロパティの指すオブジェクトにJavaScriptが「オブジェクト一号」という名前をつけたとする。その後片桐姫子プロパティや橘怜プロパティにオブジェクトを定義していくと、それぞれに内部では「二号」「三号」という名前がつけられるだろう。こうなると問題が出てくる。鈴木さやかのオブジェクトを定義する番になったときそれがたまたま6番目なら良いが、そうでなかった場合にはなにがなんだかわからなくなってしまう。(意味がわからない人はこの段落は読み飛ばしてください)
 で、現実的にこの仕様が原因で問題が起こるのは主に代入処理を伴うときである。
 以下のサンプルコードは(大々的に端折ってあるが)上の続きである。

ry)...
桃月学園.柏木優奈 = 桃月学園.柏木優麻;
桃月学園.柏木優奈.通称 = '優奈ちゃん';
...(ry

 ここでは柏木優奈プロパティにオブジェクトを定義している。その際に彼女の双子の姉である柏木優麻プロパティの値を代入演算子=柏木優奈プロパティに代入することによって柏木優麻プロパティに柏木優奈プロパティが参照するオブジェクトをコピーして、その後二人の異なるプロパティだけを書き換えようとしている。しかしこれは意図通りの結果にはなってくれない。この処理で柏木優奈プロパティに代入されるのは柏木優麻プロパティにオブジェクトを定義したときに作られたそのオブジェクトのJavaScript内部における保存先の名前なのである。つまりJavaScriptはプロパティ柏木優奈とプロパティ柏木優麻において同じオブジェクトを参照する。そして次の行で通称プロパティが代入されるオブジェクトは柏木優麻プロパティを定義したときに作られたオブジェクトの通称プロパティになる。これでは柏木優奈のオブジェクトを定義したことにはならない。
 ではどうすればよいか。柏木優麻プロパティが指すオブジェクトを柏木優奈プロパティに正しくコピーすることができればよい……、のではあるのだが、実はオブジェクトのコピーという問題はその方法云々以前に、そもそもオブジェクトというものをコピーすることが許されるのか、という倫理的な面を含めいろいろと考慮しなければならいことが多く、とにかくメンド臭い。それはそれで興味深い問題ではあるのだけれど、とりあえずここでは保留しておく。
 そんなわけで柏木優奈のオブジェクトを定義するには、たとえ柏木優麻のオブジェクトと似た要素が多くてコードを書くのが面倒でも、柏木優奈のためのプロパティを彼女のためにひとつひとつ定義していくのが最善ではないかと思う。このことはひとりの人間の定義は単に似ているからといって簡単にコピーできるものではない、ということを改めて思い出させてくれる。JavaScriptにおいて新しいオブジェクトを定義するということはつまりはそういう面倒なことであり、またそうすることによって優奈ちゃんへの愛着もまた一層深まるというものである。

 まとめてみる。
 JavaScript言語において新しいオブジェクトを生成するためにはnew演算子をつけてオブジェクトのコンストラクタ関数を呼び出さなければならない。こうすることがJavaScript言語における正しいオブジェクトの生成方法である。(ただしこのサンプルで桃月学園.柏木優奈 = new Object(桃月学園.柏木優麻);とやってもうまくいかない。これはオブジェクトのコンストラクタ関数Objectがそういう仕様になっているのが原因だろうと思うのだが、個人的にはちょっと納得しにくい)
 そしてオブジェクトをプロパティに代入するときに代入式で扱われる値はそのオブジェクトの内容ではなく、オブジェクトが生成されたときにJavaScriptによって付けられた名前である。
 このオブジェクトとプロパティとの関係は、オブジェクトをファイルみたいなものだと考えるとわかりやすいかもしれない。プロパティに保存されるのはJavaScriptによって付けられたファイル名であり、プロパティ名が直接ファイルを指すわけではない、と。

 さて次回は、この問題が起こる根本的な原因を考えてみる(予定)。

関連リンク
ぱにぽに 氷川へきる - Google 検索

PR

JavaScriptのシェル、らしきもの(JavaScript Shel)

 JavaScriptでちょっとした実験や簡単なテストをしたい、なんてとき、いちいち外部JavaScriptファイルを読み込むHTML組んでテストスクリプト書いてwindow.alert()とかさせるのがメンドくさーい。ので、ブラウザにシェルっぽい動作をさせるスクリプトを書いてみた。
 といっても<textarea>の内容をeval()だけ、というアホみたいな内容。
 ファイルはふたつ。ひとつめはHTML部。ファイル名はなんでも。文字コードはUTF-8。

 もうひとつはJavaScriptファイル。ファイル名'jsPlus.js'で上のHTMLと同じフォルダに。文字コードは同じくUTF-8。(簡単な文字列操作の関数やらが入ってます。詳しくはソース内のコメントに)

 ひとつめのHTMLをブラウザで開くとシェル起動。<textarea>にJavaScriptのコード入力してsubmitボタンをー、なんてことは書くまでもないな。
 見ての通り機能なんてものはなんにもナッシング。あまりにも機能がないのでタイトルはJavaScript Shel。さらにマウスを手放せない仕様のためとっても使いづらーい。まあしかし、すでにJavaScriptを使っている人ならもっとマシなもんを自分で作る(あるいはすでに作っている?)だろうし、現在勉強中という人も自分であれこれ試してみながら作ったほうがためになるのだろう。そんなに時間がかかるものでもないし。
 しかしこのままではあまりにも役立たずなので、とりあえずHTMLを書き換えなくても外部JavaScriptファイルを選択読み込みできるようにする予定。

JavaScript Shel サバに上げてみた。jsShel.html
 画像は実行中画面のスクリーンショット。

 (追記)いろいろと意図しない挙動をするのでサバに上げてある分については随時更新。ただこの記事のソースは自戒の意も込め更新はしないつもり。ある程度カタチになったらまた新たな記事を書く予定。

外部JavaScriptファイルの選択読み込み

 HTMLを読み込むたびに異なるJavaSciptファイルを読み込ませる方法を考えてみた。Cookieに読み込みファイルを指定してリロード、みたいな使い方を想定。で、作ったスクリプトが以下。(一部。HTMLファイルのヘッダ部分)

 ページを読み込む度に3つの外部JavaScriptファイルのどれかをランダムで読み込む、というばかばかしくも微笑ましいスクリプトなんだけど(いや、これ自体すでに反則くさいのだけれど。JavaScriptからscriptタグを書くちうのは実際のところ、どうなん?)、Firefoxでなんだかヘンテコリンな挙動(IEとOperaでは意図通りに動いた。こういうときにひとりだけおかしな動きをして私を困惑させるのは大抵IEなんだけどねぇ、ははは)。あれこれ手を尽くしてやっとこさ解決。解決版スクリプトは以下。

 要するにFirefoxでは、スクリプト中文字列リテラル内のスクリプト閉じタグをHTMLが食っちゃった、ということでした。Forefoxから「ページのソースを表示」すればブラウザが食うタグは色分けされるのですぐわかることだったんだが、なかなかそこにたどり着けずけっこうてこずりました。
 これはファイル選択スクリプトを外部ファイルにすれば初めから起こらない問題。とはいえ、いずれは足をとられるであろう問題ではあったので早めに遭遇できて良かった、ともいえるわけで。

 この処理にCookieを組み合わせることで複数のスクリプトファイルのうち必要なものを選択して読み込ませようと目論んでいるのだが、この処理を使ってページを作るとブラウザの「戻る」ボタンとの相性がものすごく悪くなるんよね。
 この処理に限らず、クライアント側のスクリプトでHTMLを動的に動かす処理は全般的にブラウザの「戻る」とリロード機能とは相性が悪いものなんだけど、さて、どうしたもんか。

あけましておめでとうございます

 月日が経つのが早く感じられるのは最近ますますモノ忘れがひどくなってきたような気がすることと関係あるのかも。ないのかも。でも時の感じかたが若い頃と変わったのかどうかはよくわからない。なぜなら若い頃のことなんて、すでに忘れてしまったからー。
 とか思いつつ、2007年も無事始まりました。ともあれめでたし。

 とりあえず今年一発目の目標、「大晦日から正月3日までお金を一銭も使わない」、は無事達成。微妙な達成感を肴に安酒をちびり。とかなんとか。正月からみみっちいことゆーな。
 ちなみに今年一年の目標は世界征服です。いやマジマジ。

 30日はそれなりにお掃除なんかして、31日はおそばを食べて。正月気分を盛り上げたところで、元旦にはお雑煮食って酒飲んで。でもおせちらしいものといえば田作りのようなものを作って(年越しそばのだしをとった残り)、あとはかまぼこ(すんごくやっすいヤツ)食ったくらい。
 とまあこんな感じで例年通りの冴えなくも楽しい年末年始でした。

皆々様、

 どうか良いお年を~。

...続きを読む?

その2

ep2 あまりにも説明不足。

結局

Pixia ペイン太でいろいろ試行錯誤しつつやっていましたが、行き詰まり。結局前回と同じくPixiaとAzPainterの二刀流メインで。
 こっちはPixiaで描いてるときのスクショ。

AzPainter んでもって、こっちはAzPainter。

ペイン太君

ペイン太

 あれこれとソフトを使い分けて描くのもまあ楽しいっちゃ楽しいのだけど、面倒臭いし、なにより時間が掛かるのが問題。だもんで今回はタブレットに付属のPainter Classic一本で描いてみることに。
 で、いろいろやってみんだが、バンドル品だけに(?)機能がものすごく中途半端。描き味は確かに悪くないしキャンバスを回しながら描けるのはものすごく魅力(個人的にはこの機能がないソフトは「お絵描き」のソフトとしては認められん。この機能がないソフトは私の中ではあくまで「画像編集」ソフト)。ただ気に入ったブラシがないのと、乗算レイヤーが使えないのが致命的。
 というわけで(←言い訳)、今週は未完成。

 とりあえず編集中の画面を上げてみる。(原寸、256色に減色)
 あ、このスクショだとPC何使ってるかバレバレじゃん(汗


続き

No.1-2 続き。
 色の濃さとかが前回と変わっていたりするが、まあ気にしないで。

 見せ方とかももうちょっとなんとかしたいのだけど、なかなかいい知恵出ないのよ。とりあえず記事自体を増やしてからいろいろ試しつつ、みたいな予定で。

こんなんやってる

No.1-1 ダウンロードしたペイントソフトのテストも兼ねて、最近こんなんやっとります。
 使ったソフトは「わんぱくペイント」(下描き)、「Pixia」(ペン入れ、ベタ)、「AzPainter」(コマ割り、写植)、「Yukari」(リサイズ)。
 とにかく効率悪過ぎ。時間ばっかり掛かってどうにもならん。
 まあいろいろと試行錯誤しつつ。

[1][2][3][4][5][6][7][8]
忍者ブログ [PR]
コンテンツ
カテゴリ別アーカイブ
月別アーカイブ
最新コメント
ブログ内検索

Since 2005 (C) hya All Rights Reserved.