プロが教えるわが家の防犯対策術!

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


新年早々質問させていただけたらと思います。

ただいまオライリーの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はプロパティという認識で間違いないでしょうか?

ということはプロパティのなかにプロパティをを設定してるという形になるのでしょうか?

どうもしっくりこなくて悩んでおります。
よろしくお願いします。

A 回答 (5件)

2行目:includesや3行目foreachはプロパティ名


関数がプロパティ値
2つあわせてrange.methodsのプロパティ

JavaScriptにおいて多くのものはオブジェクト(Objectのインスタンス)
オブジェクトじゃないものも暗黙でラッパーされてオブジェクトにされる
    • good
    • 0

「オブジェクトがプロパティの集合である」という概念は理解できているでしょうか。



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値」とはいわないでしょう?
「プロパティ名」と「プロパティ値」は明確に区別してください。
    • good
    • 0

実はここら辺の深い所は自分もあやふやなんですが、質問者の方の理解でよろしいかと思います。


osaka58さんはプロパティの中にプロパティが設定されているのが、しっくり来てないんだと思うんですが特に不思議なことではないです。

多次元の配列みたいな物で、オブジェクトの中にオブジェクトを設定しているということです。
説明が難しいですが、以下のコードが動くのは理解できますか?

--------------------- コードここから ---------------------
var hash = {
aa: {
bb: "bb"
}
};

alert(hash.aa.bb); // "bb"が出力される
--------------------- コードここまで ---------------------

それと下のコードも動くのも分かりますでしょうか?

--------------------- コードここから ---------------------
var method = function(){
alert("aa");
}

method(); // alert("aa")が実行される
--------------------- コードここまで ---------------------
osaka58さんが書かれたコードは、おそらくこの2つのコードの合わせ技と考えて問題ないかと思います。

説明が分かりにくいかもしれませんが、理解の手助けになれば嬉しいです。
    • good
    • 0

このサンプル?



http://books.google.co.jp/books?id=wz0Rpydy-iEC& …

だとすると、osaka58さんの質問文に対しての回答はANo.1のとおりなんだけど、実際のところは、JavaScriptのオブジェクト指向の仕掛けについて、osaka58さんがどれだけ理解しているかを、回答者が把握しないと説明が難しそうな。
    • good
    • 0

このmethodに設定されている値は、{ includes:○○ , foreach:○○ , toString: ○○ } という形の値になっている、ということはおわかりだと思います。

これは、なんだかわかりますか? 一般に連想配列と呼ばれるものですね。すなわち、通常の配列のようにインデックス番号で値を指定するのでなく、名前をつけて値を管理するタイプの配列ですね。

そして、JavaScriptでは、オブジェクトというのは実は連想配列のこと(?)なのです。連想配列の中の値が、いわばオブジェクトの中のプロパティに相当するものである、と考えればよいと思います。

また、JavaScriptでは、関数そのものもオブジェクトとして扱うことができます。オブジェクトのプロパティに関数を代入すれば、それを呼び出すことでその関数が実行されます。こうした、オブジェクトのプロパティに関数が代入されているものをメソッドと呼びます。

ですから、r.inculdes(2)というのは、「rangeオブジェクトのincludesプロパティに設定された関数を実行している」ということであり、これを言い換えれば、「rangeオブジェクトのincludesメソッドを実行している」ということにもなります。


>プロパティのなかにプロパティを設定してる

プロパティに、オブジェクトを設定しているのです。そのオブジェクトは関数である場合もありますし、そのオブジェクトの中に更にメソッドが用意されていることもあります。
    • good
    • 0
この回答へのお礼

さっそくの御回答本当にありがとうございます!
まだちょっと腑に落ちない部分があり、ご質問させていただけたら助かります。

[プロパティに、オブジェクトを設定しているのです。]
とご説明いただいておりますが、range関数(オブジェクト)のmethodsという名前のプロパティの値にinclude:function~などのプロパティ(関数が設定されてるこでここではメソッドとも言える)の集まりのオブジェクトを設定する。という意味でしょうか?

今回はメソッドの集まりだからオブジェクトになるのでしょうか?
仮にinclude: 'test'とかのプロパティの値が文字列だった場合も同様でしょうか?

ということは、プロパティ=オブジェクトという結論に至ってしまいました。。
面倒くさい質問かと思いますがお知恵をお借りできれば助かります。

お礼日時:2013/01/03 15:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!