FrontPage  Index  Search  Changes  Login

javascript

オブジェクトの生成

参照元:http://nanto.asablo.jp/blog/2005/10/24/118564

JavaScript における new 演算子の動作は大まかにいって以下のとおりである。(new F() とした場合。)

1. 新しいオブジェクトを作る。
2. 1 で作ったオブジェクトの [[Prototype]] 内部プロパティ (__proto__ プロパティ) に
   F.prototype の値を設定する。
     F.prototype の値がオブジェクトでないのなら代わりに
     Object.prototype の値を設定する。
3. F を呼び出す。このとき this の値は 1 で作ったオブジェクトとし、
   引数には new 演算子とともに使われた引数をそのまま用いる。
4. 3 の返り値がオブジェクトならそれを返す。そうでなければ 1 で作ったオブジェクトを返す。

コードであらわすと以下のようになる。

 Function.prototype.construct = function () {
   var newInstance = new Object();
   if (this.prototype instanceof Object) {
     // prototype がオブジェクトなら入れ替える
     // this の prototype に定義した関数を使用できる
     newInstance.__proto__ = this.prototype;
   }

   // 新しいインスタンスに対してコンストラクタ関数が実行されるので
   // プロパティや内部関数が追加される
   //
   // newInstance.name = name
   // newInstance.get_name = function(){}
   //
   // this.hoge は分かるんだけど、this が付いていないもの(inner_say)の動作は?
   //
   // var F = function() {
   //   function inner_say() {
   //     println('nya-');
   //   }
   //   var fuga = function() {
   //     println('gya-');
   //   }
   // }
   //
   // this.hoge なオブジェクトのプロパティから呼ばれる場合は参照が保持される。
   // this.hoge なオブジェクトのプロパティから呼ばれない場合は破棄されてる?(必要ないし)
   //
   //
   var returnValue = this.apply(newInstance, arguments);
   if (returnValue instanceof Object)
     return returnValue;
   return newInstance;
 };

 var o = F.construct(arg); // == new F(arg)

コンストラクタ

var F = function(name) {
  this.name = name;
}

F.prototype.get_name = function() {
  return this.name;
}

println('--- F.constructor');
println(F.constructor);
println('--- F.prototype.constructor');
println(F.prototype.constructor);
println("--- new F('basyura').constructor");
println(new F('basyura').constructor);
println("--- new F('basyura').__proto__");
println(new F('basyura').__proto__);
println("--- new F().__proto__.constructor");
println(new F().__proto__.constructor);
// => TypeError: Cannot read property "constructor" from undefined
// new F() で得られたものはオブジェクトなので prototype を持っていない

実行結果

--- F.constructor
function Function() { [native code for Function.Function, arity=1] }

--- F.prototype.constructor
function (name) {
    this.name = name;
}

--- new F('basyura').constructor
function (name) {
    this.name = name;
}

--- new F('basyura').__proto__
[object Object]

--- new F().__proto__.constructor
function (name) {
    this.name = name;
}
Last modified:2011/03/11 11:46:17
Keyword(s):
References:[FrontPage]