Crockford ได้ทำสิ่งต่างๆมากมายเพื่อเป็นที่นิยมในเทคนิค JavaScript ที่ดี จุดยืนของเขาเกี่ยวกับองค์ประกอบสำคัญของภาษาได้ก่อให้เกิดการอภิปรายที่เป็นประโยชน์มากมาย ที่กล่าวว่ามีคนจำนวนมากเกินไปที่จะประกาศว่า "ไม่ดี" หรือ "เป็นอันตราย" เป็นข่าวประเสริฐแต่ละครั้งปฏิเสธที่จะมองข้ามความคิดเห็นของชายคนหนึ่ง บางครั้งก็น่าหงุดหงิด
การใช้ฟังก์ชันการทำงานของnew
คำหลักนั้นมีข้อดีหลายประการในการสร้างแต่ละวัตถุตั้งแต่เริ่มต้น:
- มรดกต้นแบบ ในขณะที่มักจะมองด้วยความสงสัยและการเยาะเย้ยโดยผู้ที่คุ้นเคยกับภาษา OO ตามระดับเทคนิคการสืบทอดพื้นเมืองของ JavaScript เป็นวิธีที่ง่ายและมีประสิทธิภาพน่าแปลกใจของการใช้รหัส และคำหลักใหม่คือวิธีการที่ยอมรับ (และใช้ได้เฉพาะข้ามแพลตฟอร์ม) ของการใช้งาน
- ประสิทธิภาพ. นี่คือผลข้างเคียงของ # 1: หากฉันต้องการเพิ่ม 10 วิธีในทุกวัตถุที่ฉันสร้างฉันสามารถเขียนฟังก์ชันการสร้างที่กำหนดแต่ละวิธีให้กับแต่ละวัตถุใหม่ด้วยตนเอง ... หรือฉันสามารถกำหนดให้กับ ฟังก์ชั่นการสร้าง
prototype
และใช้new
ในการประทับตราวัตถุใหม่ ไม่เพียงแค่นี้จะเร็วขึ้นเท่านั้น (ไม่จำเป็นต้องใช้รหัสสำหรับแต่ละวิธีในต้นแบบ) แต่จะหลีกเลี่ยงการทำให้บอลลูนแต่ละวัตถุมีคุณสมบัติแยกต่างหากสำหรับแต่ละวิธี บนเครื่องที่ช้าลง (หรือโดยเฉพาะอย่างยิ่งล่าม JS ที่ช้ากว่า) เมื่อมีการสร้างวัตถุจำนวนมากสิ่งนี้อาจช่วยประหยัดเวลาและหน่วยความจำได้อย่างมาก
และใช่new
มีข้อเสียที่สำคัญอย่างหนึ่งโดยอธิบายด้วยคำตอบอื่น ๆ : ถ้าคุณลืมที่จะใช้มันรหัสของคุณจะแตกโดยไม่มีการเตือนล่วงหน้า โชคดีที่ข้อเสียนั้นลดลงอย่างง่ายดายเพียงเพิ่มโค้ดลงในฟังก์ชัน:
function foo()
{
// if user accidentally omits the new keyword, this will
// silently correct the problem...
if ( !(this instanceof foo) )
return new foo();
// constructor logic follows...
}
ตอนนี้คุณสามารถมีข้อได้เปรียบnew
โดยไม่ต้องกังวลเกี่ยวกับปัญหาที่เกิดจากการใช้ผิดวัตถุประสงค์โดยไม่ตั้งใจ คุณสามารถเพิ่มการยืนยันในการตรวจสอบหากความคิดของรหัสที่ใช้งานไม่ได้อยู่ในใจของคุณอย่างเงียบ ๆ หรือเป็นบางส่วนแสดงความคิดเห็นให้ใช้การตรวจสอบที่จะแนะนำข้อยกเว้นรันไทม์:
if ( !(this instanceof arguments.callee) )
throw new Error("Constructor called as a function");
(โปรดทราบว่าตัวอย่างนี้สามารถหลีกเลี่ยงการเขียนโค้ดชื่อฟังก์ชั่นคอนสตรัคเตอร์ได้ยากเหมือนตัวอย่างก่อนหน้านี้ซึ่งไม่จำเป็นต้องยกตัวอย่างวัตถุจริง - ดังนั้นจึงสามารถคัดลอกลงในแต่ละฟังก์ชันเป้าหมายโดยไม่มีการแก้ไข)
John Resig ได้อธิบายรายละเอียดเกี่ยวกับเทคนิคนี้ในโพสต์อินสแตนซ์ "ระดับ" แบบเรียบง่ายของเขารวมถึงวิธีการสร้างพฤติกรรมนี้ใน "ชั้นเรียน" ของคุณตามค่าเริ่มต้น แน่นอนคุ้มค่าอ่าน ... เป็นหนังสือที่จะเกิดขึ้นของความลับของนินจา JavaScriptซึ่งพบที่ซ่อนทองในนี้และอื่น ๆ อีกมากมาย "อันตราย" ลักษณะของภาษาจาวาสคริปต์ (คนบทบนwith
โดยเฉพาะอย่างยิ่ง enlightening สำหรับพวกเราที่ไล่แรก คุณลักษณะที่มีความผิดพลาดอย่างมากนี้เป็นกลไก)