皆様あけましておめでとうございます!!
新年早々質問させていただけたらと思います。
ただいまオライリーのjavascriptのサイ本第六版を読みながら勉強してるのですが、
以下の部分がどうしても理解できません・・・
range.methods = {
includes: function(x) { return this.from <= x && x <= this.to; },
foreach: function(f) {
for(var x = Math.ceil(this.from); x <= this.to; x++) f(x);
},
toString: function() { return "(" + this.from + "..." + this.to + ")"; }
};
var r = range(1,3); // Create a range object
r.includes(2); // => true: 2 is in the range
r.foreach(console.log); // Prints 1 2 3
console.log(r); // Prints (1...3)
本にmethodsプロパティにinculedsやforeachを格納すると書いてあります。
2行目:includesや3行目foreachはプロパティでプロパティに関数を設定することでr.inculdes(2)で関数として呼び出しているんですよね!? なので2行目:includesや3行目foreachはプロパティという認識で間違いないでしょうか?
ということはプロパティのなかにプロパティをを設定してるという形になるのでしょうか?
どうもしっくりこなくて悩んでおります。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
2行目:includesや3行目foreachはプロパティ名
関数がプロパティ値
2つあわせてrange.methodsのプロパティ
JavaScriptにおいて多くのものはオブジェクト(Objectのインスタンス)
オブジェクトじゃないものも暗黙でラッパーされてオブジェクトにされる
No.4
- 回答日時:
「オブジェクトがプロパティの集合である」という概念は理解できているでしょうか。
var obj = {x: true, y: false}; // obj は プロパティ x,y の集合である
var arr = [true, false]; // arr はプロパティ 0,1 の集合である
JavaScript ではオブジェクトのプロパティにどんな値でも格納できます。
つまり、オブジェクトのプロパティにオブジェクトを格納することも当然できるわけです。
var foo = {x: true, y: false};
var piyo = {hoge: foo} // プロパティ hoge に オブジェクト foo を格納している
alert(piyo.hoge.x); // true
piyo.hoge はオブジェクト foo を「参照」しています。
ですので、piyo.hoge.x のように foo のプロパティ x を使用できるのです。
piyo.hoge が参照するのはあくまでオブジェクト foo ですから、プロパティにプロパティを設定するわけではありません。
プロパティに設定したオブジェクトから更にプロパティを参照している、と理解するのが適切かと思います。
> ということは、プロパティ=オブジェクトという結論に至ってしまいました。。
「プロパティ=オブジェクト」ではなく、プロパティがオブジェクトを参照していると覚えてください。
var obj = {x: true, y: false};
この例でいえば、「プロパティ === Boolean値」とはいわないでしょう?
「プロパティ名」と「プロパティ値」は明確に区別してください。
No.3
- 回答日時:
実はここら辺の深い所は自分もあやふやなんですが、質問者の方の理解でよろしいかと思います。
osaka58さんはプロパティの中にプロパティが設定されているのが、しっくり来てないんだと思うんですが特に不思議なことではないです。
多次元の配列みたいな物で、オブジェクトの中にオブジェクトを設定しているということです。
説明が難しいですが、以下のコードが動くのは理解できますか?
--------------------- コードここから ---------------------
var hash = {
aa: {
bb: "bb"
}
};
alert(hash.aa.bb); // "bb"が出力される
--------------------- コードここまで ---------------------
それと下のコードも動くのも分かりますでしょうか?
--------------------- コードここから ---------------------
var method = function(){
alert("aa");
}
method(); // alert("aa")が実行される
--------------------- コードここまで ---------------------
osaka58さんが書かれたコードは、おそらくこの2つのコードの合わせ技と考えて問題ないかと思います。
説明が分かりにくいかもしれませんが、理解の手助けになれば嬉しいです。
No.2
- 回答日時:
このサンプル?
http://books.google.co.jp/books?id=wz0Rpydy-iEC& …
だとすると、osaka58さんの質問文に対しての回答はANo.1のとおりなんだけど、実際のところは、JavaScriptのオブジェクト指向の仕掛けについて、osaka58さんがどれだけ理解しているかを、回答者が把握しないと説明が難しそうな。
No.1
- 回答日時:
このmethodに設定されている値は、{ includes:○○ , foreach:○○ , toString: ○○ } という形の値になっている、ということはおわかりだと思います。
これは、なんだかわかりますか? 一般に連想配列と呼ばれるものですね。すなわち、通常の配列のようにインデックス番号で値を指定するのでなく、名前をつけて値を管理するタイプの配列ですね。そして、JavaScriptでは、オブジェクトというのは実は連想配列のこと(?)なのです。連想配列の中の値が、いわばオブジェクトの中のプロパティに相当するものである、と考えればよいと思います。
また、JavaScriptでは、関数そのものもオブジェクトとして扱うことができます。オブジェクトのプロパティに関数を代入すれば、それを呼び出すことでその関数が実行されます。こうした、オブジェクトのプロパティに関数が代入されているものをメソッドと呼びます。
ですから、r.inculdes(2)というのは、「rangeオブジェクトのincludesプロパティに設定された関数を実行している」ということであり、これを言い換えれば、「rangeオブジェクトのincludesメソッドを実行している」ということにもなります。
>プロパティのなかにプロパティを設定してる
プロパティに、オブジェクトを設定しているのです。そのオブジェクトは関数である場合もありますし、そのオブジェクトの中に更にメソッドが用意されていることもあります。
さっそくの御回答本当にありがとうございます!
まだちょっと腑に落ちない部分があり、ご質問させていただけたら助かります。
[プロパティに、オブジェクトを設定しているのです。]
とご説明いただいておりますが、range関数(オブジェクト)のmethodsという名前のプロパティの値にinclude:function~などのプロパティ(関数が設定されてるこでここではメソッドとも言える)の集まりのオブジェクトを設定する。という意味でしょうか?
今回はメソッドの集まりだからオブジェクトになるのでしょうか?
仮にinclude: 'test'とかのプロパティの値が文字列だった場合も同様でしょうか?
ということは、プロパティ=オブジェクトという結論に至ってしまいました。。
面倒くさい質問かと思いますがお知恵をお借りできれば助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript console.logがどうしても2つ機能しないのでアドバイスをくださいお願いします 2 2022/07/07 22:13
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- JavaScript JavaScriptの即時関数の書き方 1 2022/11/29 09:52
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ローカルのレジストリを読みたい
-
イベントevt?evt.target:event....
-
画面間でのJavaScrip...
-
JSPの処理の途中で、JavaScript...
-
初心者です。gulpでコンパイル...
-
ASP(VBS) ←→ JavaScript の変数...
-
VB.NET2003 テキストボックスに...
-
VBAによる第3、4水準文字の判定...
-
C#でTextBoxに数値のみ入力可能...
-
javascript 文字列の最後から1...
-
resizeToメソッドが動作しません
-
Access VBAで、数字だけをチェ...
-
VC#でテキストボックスに変数の...
-
jQuery ui Datepicker 明日以降...
-
アクセスのフォームでタイマー...
-
リクエスト結果が一瞬しか表示...
-
alert()が実行できない
-
gas 全角数字を半角数字に変換
-
自作関数から WndProc( ) を止める
-
禁止文字チェック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ローカルのレジストリを読みたい
-
Webページ中の javascript をVB...
-
jquery か javascript で json ...
-
エクセル2010のvbaについて
-
javaScriptでグローバル変数に...
-
画面間でのJavaScrip...
-
文字を移動させその位置を表示...
-
オライリーのプログラミングPHP...
-
フォルダ内のファイル名を取得...
-
ASP.NETでURLにマッピングされ...
-
CSSのクラスを動的に変更 classで
-
イベントevt?evt.target:event....
-
一定時間経つと画像を消す方法
-
クラス デフォルトプロパティの...
-
strictモードでなぜエラーにな...
-
JSの「document.getElementById...
-
event.srcElementの動的設定
-
VBAの引数の指定 カッコとイコ...
-
Shell.ApplicationでのIEオブ...
-
「リンク」と「ハイパーリンク...
おすすめ情報