いろんなオブジェクトのメモ

ただのオブジェクト

実際には Object 型オブジェクト。 hash-table で Object 型オブジェクトもどき作ればいいかと。
javascript のオブジェクトだからプロトタイプチェーン(__proto__ プロパティ)を持ってて、Object.prototype がセットされてる。その Object.prototype の __proto__ にも Object.prototype がセットされてて永久ループの予感!とか思ったら null だった。
つまり

Object 型オブジェクト = {
    __proto__: Object.prototype
}
Object.prototype = {
    hasOwnProperty: function(propertyName){...},
    toString: function(){...}
    //以下略
    __proto__: null
}

みたいな hash-table を作っといて使えばいい。
ただ個別の Object 型オブジェクト(インスタンス)はプロパティを追加されるんで、個別に hash-table 作って保存しとく。Object.prototype への追加は Object.prototype に追加すりゃいい。
Object(global にあるやつ)は Function 型オブジェクトのインスタンス。パニくる。

var obj = new Object("string?");
alert(obj.toSource()); //(new String("string?"))

やばい、どうしよう。

String 型のオブジェクトとか

String, Number, Undefined, Null, Boolean はプリミティブな値でたぶんにたような扱い方できるからとりあえず String で考える。

var str = "some string";
str. //<-ここで出てくるべきもの

String 型オブジェクトそのもののプロパティは length のみ。
プロトタイプ(=String.prototype)から replace とか toLowerCase とか。
プロトタイプのプロトタイプ(= Object.prototype)から toSource とか。

global にある String ってやつ

String 型オブジェクトのコンストラクタになる関数オブジェクト。
String.prototype に (String型インスタンス).__proto__ になる Object オブジェクトを持ってる。

String 型オブジェクト

__proto__ に String.prototype をもらったオブジェクト。
あとからプロパティを追加できる。

String 値

プリミティブな文字列。
.演算とかするといちいち String 型オブジェクトに変換されるんで、ほとんど String 型オブジェクトと同じ振る舞いをする。
プロパティを追加はできるけど String 型オブジェクトに変換->プロパティアクセス-> String 値に戻る で消えちまう。

var str = "some string";
str.prop = "this is property";
alert(str.prop); //undefined
んで

String 型オブジェクトに property を追加とかしないってゆーか、ほとんどの場合 String 値の方を使ってる。String 値は自分の length プロパティと String.prototype を引き継いで、必要な property-list はみんな同じになるから

String 型オブジェクト = {
    length: 3, //とか
    __proto__: String.prototype
}
String.prototype = {
    replace: function(searchValue, replaceValue){...},
    toLowerCase: function(){...},
    //以下略
    __proto__: Object.prototype
}

みたいなの作って共有していいような気がする。

Function 型オブジェクト

これがとても面倒そう。

  • それ自体オブジェクト
  • 関数として呼び出せる
  • コンストラクタにもなる
function myFunc(arg){
    this.prop = arg;
};
myFunc.prototype.method = function(){...};
Object 型オブジェクトっぽい

ので hash-table でプロパティが追加できて __proto__ プロパティがあって。

関数として呼び出せる

ので引数をどっかに保存しといて Snippet 生成とかに使いたい。
戻り値がどんなオブジェクト/値を返すのか
jsdoc みたいなのとかから憶測して、隠しプロパティみたいにしておくか。

コンストラクタってのは

new myFunc とかでインスタンスを作れる。 new 演算すると何がどーなるかってのは
http://nanto.asablo.jp/blog/2005/10/24/118564
が詳しい&わかりやすい。

んで問題はできるインスタンスがどんなモノになるかってことなのだが。
わりと確かなのは __proto__ は Constructor(=Function 型オブジェクト)の prototype になるってこと。ただし Constructor の実行時に書き換えてなければ。
その他のプロパティは Constructor の function-body 内で this に追加したものってことになる。

但し、これは this を返すか Object 型じゃないオブジェクト(値)を返した場合で、別の Object 型オブジェクトを作って返されるとそれになる。
function-body からてきとーに憶測してみる?