Tuesday, July 25, 2006

javascript, new function(..)

สงสัยมานานแล้ว ว่าประโยค new แบบนี้ จริงๆแล้วมันหมายความว่าอะไร
function foo(x) {
...
}

var test = new foo(2);

Paul Crowley เขาอธิบายไว้ใน "Subclassing in JavaScript, part 1" ว่า
step ที่เกิดใน new foo(2) จริงๆแล้วก็คือ
  • create new blank object (call it "res")
  • res.__proto__ = foo.prototype
  • foo.apply(res, [2])
    res จะกลายเป็น this ภายใน function foo
  • return res

เห็นอย่างนี้ ก็ไม่งงแล้ว
function foo(x) {
this.x = x;
}
var test = new foo(2);
test.x; // -> 2


แต่ตอนนี้ไปงงต่อตรง
__proto__ คืออะไร และต่างกับ prototype ต่างกันอย่างไร
ใน blog ของ Paul เขาอธิบายว่า
เวลาเราหาค่า property ใน object กรณีที่ object นั้นไม่มี key นั้นอยู่
และ __proto__ ใน object นั้นถูก set ไว้
javascript ก็จะมองหา key จาก object ที่ __proto__ ชี้อยู่

แล้วถ้าลองพิมพ์ค่า foo.__proto__ หล่ะ จะได้อะไร

foo.__proto__; // => function foo(x) { this.x = x; }
foo; // => function foo(x) { this.x = x; }

? ชี้เข้าหาตัวเองเหรอ ชีวิตสับสน
แล้วถ้าอย่างนี้หล่ะ
foo.__proto__.__proto__ // => function() {}

งงต่อไป

Related link from Roti

No comments: