読者です 読者をやめる 読者になる 読者になる

私の歴史と今

読んでて恥ずかしくなるのが私の歴史。だけどそのときは今現在のように真面目に書いていた訳でね。そんな私の今を書いていく。

プロパティ:値

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がオブジェクトの種類で。