ออบเจ็กต์คือประเภทข้อมูลที่แยกกันต่างหากในลักษณะเดียวกับประเภทข้อมูลพื้นฐาน โดยมีความแตกต่างที่สำคัญเพียง 1 ข้อ กล่าวคือออบเจ็กต์จะเปลี่ยนแปลงไม่ได้ ซึ่งต่างจากประเภทพื้นฐาน ออบเจ็กต์หนึ่งๆ อาจมีข้อมูลที่เชื่อมโยงกับตัวระบุ เช่น ตัวแปร แต่จะเก็บประเภทข้อมูลของ object
ไว้โดยไม่คำนึงถึงข้อมูลที่มีอยู่
นอกเหนือจากค่าพื้นฐานแล้ว ค่า JavaScript ทั้งหมดเป็นออบเจ็กต์ อย่างไรก็ตาม ถึงแม้ลิเทอรัลพื้นฐานจะแสดงพฤติกรรมที่เหมือนออบเจ็กต์เนื่องจากการสืบทอดต้นแบบ แต่ก็ยังมีคำพูดที่ว่า JavaScript ประกอบด้วยออบเจ็กต์อย่างมีประสิทธิภาพ
ลิเทอรัลออบเจ็กต์คือวงเล็บปีกกาคู่หนึ่งล้อมรอบคู่คีย์-ค่า 0 รายการหรือมากกว่านั้นที่เรียกว่า "คุณสมบัติ" ซึ่งมีค่า JavaScript ใดก็ได้
{
"myProperty" : true
}
คีย์ของพร็อพเพอร์ตี้อาจเป็นสัญลักษณ์หรือสตริงใดก็ได้ เช่นเดียวกับเมื่อกำหนดตัวระบุให้กับตัวแปร สตริงที่ใช้เป็นคีย์พร็อพเพอร์ตี้ควรสามารถคาดการณ์ได้และให้คำอธิบาย เช่น
let carAttributes = {
"color" : "red"
};
carAttributes
> Object { color: "red" }
คีย์พร็อพเพอร์ตี้ต้องใช้ลิเทอรัลสตริงเดียว ('
) หรือแบบเครื่องหมายคำพูดคู่ ("
) ไม่ใช่เทมเพลตลิเทอรัล
let carAttributes = {
`keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal
ค่าพร็อพเพอร์ตี้อาจเป็นข้อมูลประเภทใดก็ได้ คุณสมบัติของวัตถุสามารถประกอบด้วยวัตถุ ซึ่งมีคุณสมบัติของตนเองดังนี้
let myObject = {
'key' : {
'subkey' : true,
'othersubkey' : false
}
};
myObject;
> Object { key: Object { subkey: true, othersubkey: false } }
เมื่อค่าของพร็อพเพอร์ตี้เป็นฟังก์ชัน พร็อพเพอร์ตี้นั้นจะเรียกว่า "เมธอด"
const myObject = {
"myProperty" : true,
myMethod() {
console.log( "This is a method." );
}
}
myObject.myProperty;
> true
myObject.myMethod();
> "This is a method."
คุณยังสร้างออบเจ็กต์โดยใช้คีย์เวิร์ด new
ได้อีกด้วย
let myObject = new Object();
ในตัวอย่างก่อนหน้านี้ ระบบได้กำหนดลิเทอรัลออบเจ็กต์ที่สร้างขึ้นใหม่ให้กับตัวแปรแล้ว ซึ่งเป็นขั้นตอนที่ไม่จำเป็น เนื่องจากคุณใช้ออบเจ็กต์ที่ไม่มีตัวระบุได้ทุกที่ที่คาดหวังออบเจ็กต์ เช่นเดียวกับข้อมูลประเภทอื่นๆ อย่างไรก็ตาม ลิเทอรัลออบเจ็กต์ต้องมีวงเล็บในบริบทใดก็ตามที่อาจทำให้สับสนกับคำสั่งบล็อก ในกรณีที่มีการใช้ไวยากรณ์วงเล็บปีกกาแบบแชร์ 2 แบบ ({}
) คุณไม่จำเป็นต้องดำเนินการดังกล่าวในการเริ่มการทำงานของตัวแปร
{ "value" : 2 }
> Uncaught SyntaxError: unexpected token: ':'
({ "value" : 2 })
> Object { value: 2 }
let valObj = { "value" : 2 };
valObj;
> Object { value: 2 }
ผลลัพธ์ของการสร้างวัตถุโดยใช้ new Object()
กับการสร้าง Object Literal นั้นไม่ต่างกับแบบพื้นฐาน เนื่องจากผลลัพธ์ในทั้ง 2 กรณีจะเป็นออบเจ็กต์ที่มีพร็อพเพอร์ตี้ที่รับช่วงมาจากต้นแบบ Object
อย่างไรก็ตาม มีความแตกต่างในทางปฏิบัติอยู่อย่างหนึ่งระหว่างไวยากรณ์ทั้งสอง
คีย์เวิร์ด new
ต้องกำหนดออบเจ็กต์ว่างที่จะเติมข้อมูลภายหลัง:
let myObject = new Object();
myObject.booleanValue = true;
myObject.stringValue = "My string.";
ระบบจะเติมข้อมูลออบเจ็กต์ลิเทอรัลเมื่อสร้างได้ดังนี้
let myObject = {
'booleanValue' : true,
'stringValue' : "My string."
};
แม้ว่าจะไม่ค่อยมีประโยชน์นัก แต่ก็อาจใช้ new Object()
เพื่อเปลี่ยนค่าข้อมูลดั้งเดิมเป็นออบเจ็กต์ประเภทที่เกี่ยวข้องได้ เช่น ค่าที่แสดงผลโดยใช้คีย์เวิร์ด new
ร่วมกับฟังก์ชันตัวสร้าง ตัวอย่างต่อไปนี้มีฟังก์ชันเทียบเท่ากับ new Number( 10 )
let myObject = new Object( 10 );
myObject;
> Number { 10 }
ค่า null
และ undefined
ทำให้เกิดออบเจ็กต์ว่าง ซึ่งมีการทำงานเหมือนกับการเรียกใช้ new Object()
โดยไม่ต้องใส่อาร์กิวเมนต์
การส่ง Object Literal ไปยัง new Object()
เนื่องจากอาร์กิวเมนต์จะส่งผ่าน Object Literal โดยไม่เปลี่ยนแปลง ดังนี้
let myObject = new Object( { myValue : 10 } );
myObject;
> Object { myValue: 10 }
เช่นเดียวกับการใช้ตัวสร้างสำหรับค่าพื้นฐาน การใช้ตัวสร้างสำหรับวัตถุไม่ค่อยมีประโยชน์อะไรมากกว่าการใช้สัญกรณ์การวาดวัตถุ แม้ว่าขณะสร้างออบเจ็กต์เปล่าเพื่อใส่ค่าในภายหลัง นักพัฒนาแอปก็มีแนวโน้มที่จะชอบรูปแบบตัวอักษรของออบเจ็กต์มากกว่าเพื่อความสะดวก
ทดสอบความเข้าใจ
สัญกรณ์ประเภทใดที่คุณสามารถใช้เพื่อตั้งค่าคุณสมบัติของวัตถุ
ข้อใดต่อไปนี้คือไวยากรณ์ที่ถูกต้องสำหรับการรับค่าของ myProp
myObj["myProp"];
myObj{"myProp"};
myObj("myProp");