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

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

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

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

Q&A

解決済

1回答

152閲覧

JavaScript 名前空間につきまして

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2017/11/14 01:16

編集2017/11/14 03:56

###前提・実現したいこと
ここに質問し
プログラミング初心者のものです。
下記のコードが「階層を持った名前空間の定義」の例として紹介されていたのですが、不明点がいくつかあります。
parent = parent[names[i]]でwindowオブジェクトを書き換えていると思うのですが、forループの二回目以降、parent が parent.Wings.Gihyoへと変わる動きがよくわかりません parent['Wings'] は無条件でparent.Wingsと同じものと解釈できるのでしょうか?
また、
var my = namespace('Wings.Gihyo.js.MyApp');
my.Person = function(){};
var p = new my.person();
console.log(p instanceof Wings.Gihyo.Js.MyApp.Person)
について、my.person()のインスタンスを作っているのはなぜでしょうか?
よろしくお願いいたします。

エラーメッセージ

###該当のソースコード

<script> function namespace(ns){ var names = ns.split('.'); var parent = window; for(var i = 0,len = names.length;i < len; i++){ parent[names[i]] = parent[names[i]] || {}; parent = parent[names[i]]; } return parent } var my = namespace('Wings.Gihyo.js.MyApp'); my.Person = function(){}; var p = new my.person(); console.log(p instanceof Wings.Gihyo.Js.MyApp.Person) </script>

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

m.ts10806

2017/11/14 01:27

プログラムコードは```で囲ってください。質問テンプレートの「ここにご自身が実行したソースコードを書いてください」部分をそのままソースコードに置き換えれば良いです。
退会済みユーザー

退会済みユーザー

2017/11/14 02:00

承知しました。ありがとうございます
kei344

2017/11/14 03:45

質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。本文を編集することが出来ますので、よろしくお願いします。
退会済みユーザー

退会済みユーザー

2017/11/14 03:54

承知しました。 初めてなので、そういったことを教えていただくと大変助かります。
kei344

2017/11/14 03:57

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。また、解決されていないなら状況を質問文に追記ください。
guest

回答1

0

ベストアンサー

parent['Wings'] は無条件でparent.Wingsと同じものと解釈できるのでしょうか?

はい、JavaScriptでは、常にfoo.barfoo['bar']と全く同じ意味です。

my.person()のインスタンスを作っているのはなぜでしょうか?

instanceofを使うには、基本的にnewしたインスタンスが必要です(MDN)。もちろん、Object.create__proto__の直接書き換えでもかまわないといえばかまわないのですが。

投稿2017/11/14 01:22

maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2017/11/14 01:28

ありがとうございます。 ということは、 parent[names[i]] = parent[names[i]] || {}; parent = parent[names[i]]; の部分ですが、parent一回目はnames['Wings']なので、parent['Wings'][names['Gihyo']というような形になると思います。しかしなぜparent.Window.Gihyoと足される(?)のかがわかりません...
maisumakun

2017/11/14 01:32

1回目でparent = window.Wingsとなりますが、JavaScriptのオブジェクトは代入してもコピーではなく共有されます。そのため、次にparent.Gihyoに書き込めばwindow.Wings.Gihyoにも同じものが反映されます。
退会済みユーザー

退会済みユーザー

2017/11/14 02:01

なるほど! データ型について理解を深めていきたいです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問