質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2211閲覧

名前空間に階層を持たせる方法について

newyee

総合スコア213

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/09/15 02:39

編集2018/09/15 02:40

javascript

1function namespace(ns){ 2 var names = ns.split('.'); 3 var parent = window; 4 for (var i = 0, len = names.length; i < len; i++) { 5 parent[names[i]] = parent[names[i]] || {}; 6 parent = parent[names[i]]; 7 } 8 9 return parent; 10 } 11 12 var my = namespace('Wings.Gihyo.Js.MyApp'); 13 my.Person = function(){}; 14 var p = new my.Person(); 15 console.log(p instanceof Wings.Gihyo.Js.MyApp.Person);

上記のコードに関しまして、お聞きしたいことがございます。3行目において「var parent = window」としており、変数にオブジェクトを代入している形となっているのですが、これは、「parent」という名前の「windowオブジェクト」というような捉え方で合っていますでしょうか?
また、5行目では、「parent[names[i]]」となっており、parentが配列のような形で表されているのですが、windowオブジェクトは配列としても扱うことができるということでしょうか?
以上2点につきまして、ご解説いただけましたら幸いです。よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これは、「parent」という名前の「windowオブジェクト」というような捉え方で合っていますでしょうか?

はい、あってますよ

オブジェクトを変数に代入するときは「参照の値渡し」です。
なんのこっちゃサッパリ分からないと思うので解説していきます。

ChromeブラウザはWebサイトを開いた時に、
JavaScript世界のwindowオブジェクトを自動で用意してくれます。
windowオブジェクトの実体はメモリ空間上に保存してあり、グローバル変数windowにはメモリ空間のアドレス値が入っています。

var parent = window;を行ったとき、
windowの「アドレス値」が宣言したparent変数にコピーされます。
ですのでparent.hogehogeという風にparentのプロパティを操作すると、windowオブジェクトのプロパティが釣られて変化します。

JavaScript

1var data1 = {name: "taro", score: 80}; 2var data2 = data1; 3data2.name = "jiro"; 4data2.score = 70; 5 6console.log(data1); // {name: "jiro", score: 70} 7console.log(data2); // {name: "jiro", score: 70}

windowオブジェクトは配列としても扱うことができるということでしょうか?

オブジェクトと配列は別物です。
単にオブジェクトのプロパティには2つのルールでアクセス出来るだけです。
オブジェクトの利用 - MDN

JavaScript

1var data = {name: "taro", score: 80}; 2console.log(data.name); // taro 3console.log(data["score"]); // 80

JavaScript

1parent[names[i]] = parent[names[i]] || {}; 2parent = parent[names[i]];

for文の中身のこれですね。
for文の前にvar parent = window;とかやってますが、parentってのは親という意味ですよね。
windowはwindowだから親でもなんでもないやん?

parent[names[i]]はオブジェクトのプロパティへのアクセスルールの一つでしたね。
オブジェクトに紐づくプロパティは親子関係の様にも見えます。

  • parent: オブジェクトそのもの
  • 子: オブジェクトのプロパティ

という擬似的な親子関係を想像して、parent変数を用意しているのです。

for文の1行目はparent[names[i]] || {}parent[names[i]]に代入しています。
JavaScriptでは、A || Bを評価した場合、
まずAを単体でif文に放り込んでtrueになりそうなもの(1以上の数値や文字列、オブジェクトや配列などなど…)はAそのものが返って来ます。
もしAがfalseになりそうなものだったら、Bを返します。

JavaScript

1var data = {name: "taro", score: 80}; 2 3// data.nameは常に存在するので"taro"が返ってくる 4console.log(data.name); // taro 5console.log(data.name || "nanashi"); // taro 6 7// data.ageは用意していないので18になる 8console.log(data.age); // undefined 9console.log(data.age || 18); // 18

or演算子||の右辺は{}ですね。
空のオブジェクトを作ってparentのプロパティに代入しています。

続いて変数の代入の続きです。
for文の二行目のparent = parent[names[i]]って何をやってるんでしょうか?
えええ、parent = windowしてたよね?windowオブジェクトぶっ壊れるじゃんどうしてくれんの!?!?

そうではありません。
オブジェクトを代入した変数に、別の値を代入した場合、オブジェクトのアドレス値参照が切り離されます。
百聞は一見に如かず、いつものdata変数でどうなるか試してみましょう。

JavaScript

1var data = {name: "taro", score: 80}; 2var data2 = data; 3data2.child = {name: "jiro", score: 0}; 4 5// data2はdataのアドレス値を捨てて、data.childのアドレス値に切り替わる 6data2 = data2.child; 7data2.score = 70; 8 9console.log(data); // {name: "taro", score: 80, child: {name: "jiro", score: 70}} 10console.log(data2); // {name: "jiro", score: 70}

投稿2018/09/15 03:37

編集2018/09/15 15:58
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newyee

2018/09/15 05:44

ご丁寧なご回答ありがとうございます。 プロパティにアクセスできるルールがなんだったのか、という基礎的な部分が理解できていませんでした... しかしながら、やはり以下の部分におきまして、まだ理解しきれない部分がありまして、できればお聞きしたいです... 「parent[names[i]] = parent[names[i]] || {};」 「parent = parent[names[i]];」 最初の部分では、for文一回目の処理で「parent」のWingプロパティに、「parent」のWingプロパティを代入しているかのような形となっており、次の行では、parentのプロパティに対してではなくparentそのものに、parent[names[i]]を代入しています。 ここの部分におきまして、なかなか理解できていない状態でして、度々で申し訳ないのですが、少しご説明頂けましたら幸いです。
miyabi-sun

2018/09/15 15:58

結局全部じゃないか!!! しょうがないなぁ・・・今回だけだよ?というわけで追加しました。
newyee

2018/09/16 06:05

ご丁寧に教えて頂き、ありがとうございます。 基本的な部分で分かっていない部分が多く、もっと勉強していかなければと痛感致しました。 ご丁寧に教えて下さり、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問