今日の驚き ECMAScript

※だれかはてなダイアリーで角括弧二つの連続 [[Unko]] をちゃんと出す手法教えてください…。今、わざわざ a タグで囲ってる始末…。

new

new といえば JS の OOP のキモ中のキモ。 new って何してるの?というと…、

http://bclary.com/2004/11/07/#a-13.2.2

ここに書いてある [[Construct]] という関数オブジェクトの内部メソッドが呼ばれるわけです。

13.2.2 [[Construct]]
When the [[Construct]] property for a Function object F is called, the following steps are taken:

1. Create a new native ECMAScript object.

2. Set the [[Class]] property of Result(1) to "Object".

3. Get the value of the prototype property of F.

4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).

5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the original Object prototype object as described in 15.2.3.1.

6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument list passed into [[Construct]] as the argument values.

7. If Type(Result(6)) is Object then return Result(6).

8. Return Result(1).

なんか、よく読むと 7 と 8 がすごい気になる。 7 は、 Object であるかどうかしかテストしてませんね。 this (あるいは this に入る native object )とは比較してないようだ。気になったのでテストしたみた。

function A() {
    this.text = "a";
    return this;
}

var a = new A;

function B() {
    this.text = "b";
    return a;
}

var b = new B;

print(a.text); // "a"
print(b.text); // "a"

ヒャッハー!

今日もひとつ ECMAScript に詳しくなりました。なんとなく、知れば知るほどいい言語です。 ECMA3 。いやまてよ、どの言語もここまで知れば自分にとってはいい言語ですね。もう安心して使えます。