var Human = function(name){ this.name = name; this.getName = function(){ return this.name; }; };
ken.getNameと、ken.getName()の違いがわからなかったので調べた。
var ken = new Human('ken'); alert((new Object()).toString.call(ken)); // [object Object] alert((new Object()).toString.call(ken.name)); // [object String] alert((new Object()).toString.call(ken.getName)); // [object Function] alert((new Object()).toString.call(ken.getName())); // [object String]
ken | Object | Objectだよな。 |
ken.name | String | Stringだよな。 |
ken.getName | Function | getNameはFunctionだよな |
ken.getName() | String | getName()の戻り値はStringだよな |
ken.getNameは、getNameプロパティにマッピングされている関数オブジェクトを返す。
ken.getName()は、getNameプロパティにマッピングされている関数オブジェクトを呼び出している。(マッピングされているのが関数オブジェクトの場合は、プロパティといわずにメソッドと呼ぶと。)
こんな単純なことを疑問に感じていたのか。(まあわかってよかった。)
オブジェクトの種類を調べる方法は、jQueryを参考にした。それ以外に方法あるのかなあ?
alert(Object.prototype.toString()); // [object Object]と表示される。 // コンテキストを変えてObject.prototype.toString()を利用すればオブジェクトの種類がわかる。 alert(Object.prototype.toString.call(new Object())); // [object Object] alert(Object.prototype.toString.call(new Date())); // [object Date] alert(Object.prototype.toString.call(new String())); // [object String] alert(Object.prototype.toString.call(new Boolean())); // [object Boolean] alert(Object.prototype.toString.call(new Number())); // [object Number] alert(Object.prototype.toString.call(new Function())); // [object Function] // その他 alert(Object.prototype.toString.call({}); // [object Object] alert(Object.prototype.toString.call(function(){}); // [object Function] alert(Object.prototype.toString.call(document)); // [object Object] alert(Object.prototype.toString.call(1)); // [object Number] alert(Object.prototype.toString.call(true)); // [object Boolean] alert(Object.prototype.toString.call('true')); // [object String]
数値の1がNumberオブジェクトになってるけど、、、ほんと? javaだとプリミティブ型の扱いでオブジェクトじゃないんだけど、Rubyみたいにすべてオブジェクトなのかな。
そもそもObject.prototype.toString.call(obje)という方法で正確に何がわかるのか把握していない。数値の1は本当はオブジェクトじゃないけど便宜上Numberオブジェクトとして表示してるだけかもしれないし。
むむむ。instanceofという演算子があった。
対象 | Object | Date | String | Boolean | Number | Function |
---|---|---|---|---|---|---|
new Object | true | false | false | false | false | false |
new Date | true | true | false | false | false | false |
new String | true | false | true | false | false | false |
new Boolean | true | false | false | true | false | false |
new Number | true | false | false | false | true | false |
new Function | true | false | false | false | false | true |
1 | false | false | false | false | false | false |
{} | true | false | false | false | false | false |
function(){} | true | false | false | false | false | true |
new function(){} | true | false | false | false | false | false |
つまり、数値1はオブジェクトじゃない。
むむむ。むむむ。typeofという演算子もあるのか。
typeof Object | function |
typeof Date | function |
typeof String | function |
typeof Boolean | function |
typeof Number | function |
typeof Function | function |
typeof new Object() | object |
typeof new Date() | object |
typeof new String() | object |
typeof new Boolean() | object |
typeof new Number() | object |
typeof new Function() | function |
typeof 1 | number |
typeof true | boolean |
typeof "aaa" | string |
typeof {} | object |
typeof function(){} | function |
typeof new function(){} | object |
オブジェクトは、objectとfunctionに分けられ、
プリミティブ型は、number, boolean, stringに分けられている、ということかな。
ちなみに、Object.prototype.toStringは、Objectオブジェクトに引き継がれるので、下記のようにしてもいいみたい。少しずつ仕組みがわかってきた。
alert((new Object()).toString.call(new Date())); // [object Date]
そういえば、[object xxx]のobjectって、どういう意味なのかな。オブジェクトだということなのかな。xxxがオブジェクトの種類で。