JavaScript

จาวาสคริปต์ ( / ɑː วีə ˌ s k R ɪ พีที / ) [6]ย่อบ่อยเท่าที่JSเป็นภาษาโปรแกรมที่สอดคล้องกับECMAScriptสเปค [7] JavaScript เป็นระดับสูงมักจะเป็นเพียงแค่ในเวลารวบรวมและหลายกระบวนทัศน์ มันมีไวยากรณ์หยิกวงเล็บ , พิมพ์แบบไดนามิก , ต้นแบบตาม วัตถุปฐมนิเทศและชั้นแรกฟังก์ชั่น.

ควบคู่ไปกับHTMLและCSS , JavaScript เป็นหนึ่งในเทคโนโลยีหลักของเวิลด์ไวด์เว็บ [8] JavaScript ช่วยให้การโต้ตอบหน้าเว็บและเป็นส่วนสำคัญของการใช้งานเว็บ เว็บไซต์ส่วนใหญ่ใช้สำหรับลักษณะการทำงานของเพจฝั่งไคลเอ็นต์[9]และเว็บเบราว์เซอร์หลัก ๆ ทั้งหมดมีเครื่องมือ JavaScriptเฉพาะเพื่อดำเนินการ

ในฐานะที่เป็นภาษาหลายกระบวนทัศน์, JavaScript รองรับเหตุการณ์ที่ขับเคลื่อนด้วย , การทำงานและความจำเป็นที่ รูปแบบการเขียนโปรแกรม มีอินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชัน (API) สำหรับการทำงานกับข้อความวันที่นิพจน์ทั่วไปโครงสร้างข้อมูลมาตรฐานและDocument Object Model (DOM)

มาตรฐาน ECMAScript ไม่รวมถึงการใด ๆอินพุต / เอาต์พุต (I / O) เช่นระบบเครือข่าย , การจัดเก็บหรือกราฟิกสิ่งอำนวยความสะดวก ในทางปฏิบัติเว็บเบราว์เซอร์หรือระบบรันไทม์อื่น ๆจัดเตรียม JavaScript API สำหรับ I / O

เครื่องมือ JavaScript ถูกนำมาใช้เฉพาะในเว็บเบราเซอร์ แต่ตอนนี้พวกเขาเป็นองค์ประกอบหลักของระบบรันไทม์อื่น ๆ เช่นNode.jsและDeno ระบบเหล่านี้ใช้ในการสร้างเซิร์ฟเวอร์และยังรวมอยู่ในเฟรมเวิร์กเช่นElectronและCordovaเพื่อสร้างแอพพลิเคชั่นที่หลากหลาย

แม้ว่าจะมีความคล้ายคลึงกันระหว่าง JavaScript และJavaรวมถึงชื่อภาษาไวยากรณ์และไลบรารีมาตรฐานที่เกี่ยวข้องทั้งสองภาษามีความแตกต่างกันและแตกต่างกันอย่างมากในการออกแบบ

การสร้างที่ Netscape

Mosaic เว็บเบราว์เซอร์ได้รับการปล่อยตัวในปี 1993 ในฐานะที่เป็นเบราว์เซอร์แรกที่มีอินเตอร์เฟซผู้ใช้แบบกราฟิกที่สามารถเข้าถึงคนที่ไม่ใช่ทางเทคนิคก็มีบทบาทสำคัญในการเจริญเติบโตอย่างรวดเร็วของตั้งไข่เวิลด์ไวด์เว็บ [10]จากนั้นผู้พัฒนาหลักของ Mosaic ได้ก่อตั้งบริษัทNetscapeซึ่งเปิดตัวเบราว์เซอร์Netscape Navigator ที่สวยงามมากขึ้นในปี 1994 Navigator กลายเป็นเบราว์เซอร์ที่มีคนใช้มากที่สุดอย่างรวดเร็ว [11]

ในช่วงปีแห่งการสร้างเว็บเหล่านี้หน้าเว็บอาจเป็นแบบคงที่เท่านั้นไม่มีความสามารถในการทำงานแบบไดนามิกหลังจากโหลดเพจในเบราว์เซอร์ มีความต้องการในฉากการพัฒนาเว็บที่กำลังขยายตัวเพื่อลบข้อ จำกัด นี้ดังนั้นในปี 1995 Netscape จึงตัดสินใจเพิ่มภาษาสคริปต์ให้กับ Navigator พวกเขาดำเนินการสองเส้นทางเพื่อให้บรรลุเป้าหมายนี้: ร่วมมือกับSun Microsystemsเพื่อฝังภาษาโปรแกรมJava ขณะเดียวกันก็จ้างBrendan Eichเพื่อฝังภาษาScheme [12]

การจัดการ Netscape ตัดสินใจในไม่ช้าว่าตัวเลือกที่ดีที่สุดคือ Eich ในการคิดค้นภาษาใหม่โดยมีไวยากรณ์คล้ายกับ Java และไม่เหมือนกับ Scheme หรือภาษาสคริปต์อื่น ๆ ที่ยังหลงเหลืออยู่ [12]แม้ว่าภาษาใหม่และการใช้งานล่ามจะถูกเรียกอย่างเป็นทางการว่า LiveScript เมื่อจัดส่งครั้งแรกโดยเป็นส่วนหนึ่งของรุ่น Navigator ในเดือนกันยายน 1995 แต่ชื่อก็เปลี่ยนเป็น JavaScript ในอีกสามเดือนต่อมา [12] [1] [13]

การเลือกชื่อ JavaScript ทำให้เกิดความสับสนบางครั้งอาจทำให้รู้สึกว่าเป็นการแยก Java ออกไป เนื่องจาก Java เป็นภาษาการเขียนโปรแกรมใหม่ที่กำลังมาแรงในเวลานั้นสิ่งนี้จึงถูกกำหนดให้เป็นวิธีการทางการตลาดโดย Netscape เพื่อให้ cachet ภาษาใหม่ของตัวเอง [14]

การยอมรับโดย Microsoft

MicrosoftเปิดตัวInternet Explorerในปี 1995 ซึ่งนำไปสู่สงครามเบราว์เซอร์กับ Netscape ที่ด้านหน้า JavaScript, ไมโครซอฟท์กลับวิศวกรรมนาวิเกเตอร์ล่ามในการสร้างของตัวเองที่เรียกว่าJScript

JScript เปิดตัวครั้งแรกในปี 2539 ควบคู่ไปกับการรองรับCSSและส่วนขยายไปยังHTML ในเบื้องต้น การนำไปใช้งานแต่ละอย่างแตกต่างจากการใช้งานใน Navigator อย่างเห็นได้ชัด [15] [16]ความแตกต่างเหล่านี้ทำให้ยากสำหรับนักพัฒนาที่จะทำให้เว็บไซต์ของตนทำงานได้ดีในเบราว์เซอร์ทั้งสองซึ่งนำไปสู่การใช้โลโก้ "ดูดีที่สุดใน Netscape" และ "ดูดีที่สุดใน Internet Explorer" อย่างกว้างขวางเป็นเวลาหลายปี [15] [17]

การเพิ่มขึ้นของ JScript

ในเดือนพฤศจิกายน พ.ศ. 2539 Netscapeได้ส่ง JavaScript ไปยังECMA Internationalซึ่งเป็นจุดเริ่มต้นสำหรับข้อกำหนดมาตรฐานที่ผู้จำหน่ายเบราว์เซอร์ทั้งหมดสามารถปฏิบัติตามได้ สิ่งนี้นำไปสู่การเปิดตัวข้อกำหนดภาษาECMAScriptครั้งแรกอย่างเป็นทางการในเดือนมิถุนายน 1997

กระบวนการมาตรฐานดำเนินต่อไปเป็นเวลาสองสามปีโดยมีการเผยแพร่ ECMAScript 2 ในเดือนมิถุนายน พ.ศ. 2541 และ ECMAScript 3 ในเดือนธันวาคม พ.ศ. 2542 งานใน ECMAScript 4 เริ่มขึ้นในปี พ.ศ. 2543

ในขณะเดียวกันMicrosoftก็ได้รับตำแหน่งที่โดดเด่นมากขึ้นในตลาดเบราว์เซอร์ ในช่วงต้นทศวรรษ 2000 ส่วนแบ่งการตลาดของ Internet Explorer สูงถึง 95% [18]นั่นหมายความว่าJScriptกลายเป็นมาตรฐานโดยพฤตินัยสำหรับการเขียนสคริปต์ฝั่งไคลเอ็นต์บนเว็บ

ในตอนแรก Microsoft ได้เข้าร่วมในกระบวนการมาตรฐานและใช้ข้อเสนอบางอย่างในภาษา JScript แต่ในที่สุดก็หยุดทำงานร่วมกันในงาน ECMA ดังนั้น ECMAScript 4 จึงถูกมอด

การเติบโตและมาตรฐาน

ในช่วงที่Internet Explorer มีอำนาจเหนือกว่าในช่วงต้นปี 2000 การเขียนสคริปต์ฝั่งไคลเอ็นต์หยุดนิ่ง สิ่งนี้เริ่มเปลี่ยนแปลงในปี 2547 เมื่อผู้สืบทอดของ Netscape, Mozillaเปิดตัวเบราว์เซอร์Firefox Firefox ได้รับการตอบรับอย่างดีจากหลาย ๆ คนโดยมีส่วนแบ่งการตลาดที่สำคัญจาก Internet Explorer [19]

ในปี 2548 Mozilla เข้าร่วม ECMA International และเริ่มงานตามมาตรฐานECMAScript สำหรับ XML (E4X) สิ่งนี้นำไปสู่ ​​Mozilla ที่ทำงานร่วมกับMacromedia ( Adobe Systemsได้รับในภายหลัง) ซึ่งกำลังใช้ E4X ในภาษา ActionScript 3 ซึ่งใช้แบบร่าง ECMAScript 4 เป้าหมายกลายเป็นมาตรฐานของ ActionScript 3 เป็น ECMAScript 4 ใหม่ด้วยเหตุนี้ Adobe Systems จึงเปิดตัวการใช้Tamarinเป็นโครงการโอเพ่นซอร์ส อย่างไรก็ตาม Tamarin และ ActionScript 3 นั้นแตกต่างจากการเขียนสคริปต์ฝั่งไคลเอนต์มากเกินไปและหากปราศจากความร่วมมือจากMicrosoft ECMAScript 4 ก็ไม่เคยบรรลุผล

ในขณะเดียวกันการพัฒนาที่สำคัญมากเกิดขึ้นในชุมชนโอเพ่นซอร์สที่ไม่มีส่วนเกี่ยวข้องกับงาน ECMA ในปี 2548 เจสซี่เจมส์การ์เร็ตต์ได้เปิดตัวสมุดปกขาวซึ่งเขาเป็นผู้บัญญัติศัพท์คำว่าAjaxและอธิบายถึงชุดของเทคโนโลยีซึ่ง JavaScript เป็นกระดูกสันหลังในการสร้างเว็บแอปพลิเคชันที่สามารถโหลดข้อมูลในพื้นหลังได้โดยไม่ต้องใช้แบบเต็มหน้า โหลดซ้ำ สิ่งนี้จุดประกายให้เกิดยุคฟื้นฟูศิลปวิทยาของ JavaScript โดยมีไลบรารีโอเพนซอร์สและชุมชนที่ก่อตัวขึ้นรอบ ๆ ห้องสมุดใหม่ ๆ ที่ถูกสร้างขึ้นรวมทั้งjQuery , ต้นแบบ , Dojo ToolkitและMooTools

Googleเปิดตัวเบราว์เซอร์Chromeในปี 2008 พร้อมกับV8 JavaScript engine ที่เร็วกว่าคู่แข่ง [20] [21]นวัตกรรมที่สำคัญคือการคอมไพล์แบบทันเวลา (JIT), [22]ดังนั้นผู้จำหน่ายเบราว์เซอร์รายอื่นจึงจำเป็นต้องยกเครื่องเอ็นจิ้นของตนสำหรับ JIT [23]

ในเดือนกรกฎาคม 2008, บุคคลที่แตกต่างกันเหล่านี้ร่วมกันมาสำหรับการประชุมในออสโล สิ่งนี้นำไปสู่ข้อตกลงในที่สุดเมื่อต้นปี 2552 เพื่อรวมงานที่เกี่ยวข้องทั้งหมดและขับเคลื่อนภาษาไปข้างหน้า ผลลัพธ์คือมาตรฐาน ECMAScript 5 ซึ่งเผยแพร่ในเดือนธันวาคม 2552

ถึงวุฒิภาวะ

งานที่มีความทะเยอทะยานเกี่ยวกับภาษายังคงดำเนินต่อไปเป็นเวลาหลายปีโดยมีการรวบรวมข้อมูลเพิ่มเติมและการปรับแต่งจำนวนมากซึ่งได้รับการตีพิมพ์อย่างเป็นทางการด้วยการตีพิมพ์ECMAScript 6 ในปี 2015 [24]

ปัจจุบันข้อกำหนดฉบับร่างได้รับการดูแลอย่างเปิดเผยบนGitHubและรุ่น ECMAScript จัดทำผ่านสแนปชอตประจำปี [25]การแก้ไขภาษาที่เป็นไปได้จะได้รับการตรวจสอบผ่านกระบวนการเสนอที่ครอบคลุม [26] [27]ตอนนี้นักพัฒนาตรวจสอบสถานะของคุณลักษณะที่กำลังจะมาถึงทีละรายการแทนหมายเลขรุ่น [25]

ระบบนิเวศของ JavaScript ในปัจจุบันมีไลบรารีและเฟรมเวิร์กจำนวนมากแนวทางปฏิบัติในการเขียนโปรแกรมที่เป็นที่ยอมรับและเพิ่มการใช้งาน JavaScript นอกเว็บเบราว์เซอร์ นอกจากนี้ด้วยการเพิ่มขึ้นของแอปพลิเคชันหน้าเดียวและเว็บไซต์อื่น ๆ ที่ใช้ JavaScript จำนวนมากจึงมีการสร้างทรานส์ไพเลอร์จำนวนมากเพื่อช่วยในกระบวนการพัฒนา [28]

"JavaScript" เป็นเครื่องหมายการค้าของOracle Corporationในสหรัฐอเมริกา [29]ใช้ภายใต้ใบอนุญาตสำหรับเทคโนโลยีที่คิดค้นและนำไปใช้โดย Netscape Communications และบุคคลอื่น ๆ [30]

JavaScript เป็นภาษาสคริปต์ฝั่งไคลเอ็นต์ที่โดดเด่นของเว็บโดย 95% ของเว็บไซต์ใช้เพื่อจุดประสงค์นี้ [9]สคริปต์ถูกฝังในหรือรวมจากเอกสารHTMLและโต้ตอบกับ DOM เว็บเบราว์เซอร์หลักทั้งหมดมีเอ็นจิ้น JavaScriptในตัวที่รันโค้ดบนอุปกรณ์ของผู้ใช้

ตัวอย่างพฤติกรรมตามสคริปต์

  • กำลังโหลดเนื้อหาหน้าใหม่โดยไม่ต้องโหลดหน้าซ้ำ ตัวอย่างเช่นเว็บไซต์โซเชียลมีเดียใช้ Ajax เพื่อให้ผู้ใช้สามารถโพสต์ข้อความใหม่ได้โดยไม่ต้องออกจากเพจ
  • ภาพเคลื่อนไหวขององค์ประกอบของหน้าเช่นการเลือนเข้าและออกการปรับขนาดและการเคลื่อนย้าย
  • เนื้อหาเชิงโต้ตอบเช่นเกมและวิดีโอ
  • ตรวจสอบค่าอินพุตของเว็บฟอร์มเพื่อให้แน่ใจว่ายอมรับได้ก่อนที่จะส่งไปยังเซิร์ฟเวอร์
  • ส่งข้อมูลเกี่ยวกับพฤติกรรมของผู้ใช้สำหรับการวิเคราะห์ , ติดตามการโฆษณาและข้อมูลส่วนบุคคล

ไลบรารีและเฟรมเวิร์ก

เว็บไซต์ส่วนใหญ่ใช้ไลบรารี JavaScriptของบุคคลที่สามหรือเฟรมเวิร์กของเว็บแอปพลิเคชันเป็นส่วนหนึ่งของการเขียนสคริปต์หน้าฝั่งไคลเอ็นต์ [31]

jQueryเป็นไลบรารีที่ได้รับความนิยมมากที่สุดซึ่งใช้โดยเว็บไซต์มากกว่า 70% [31]

เชิงมุมกรอบถูกสร้างขึ้นโดยGoogleสำหรับการให้บริการเว็บของตน ปัจจุบันเป็นโอเพ่นซอร์สและเว็บไซต์อื่น ๆ ใช้งาน ในทำนองเดียวกันFacebook ได้สร้างกรอบการตอบสนองสำหรับเว็บไซต์และปล่อยให้เป็นโอเพ่นซอร์สในภายหลัง ขณะนี้ไซต์อื่น ๆ รวมถึงTwitterใช้งานได้แล้ว มีอีกกรอบเปิดแหล่งที่มาในการใช้งานเช่นBackbone.jsและVue.js [31]

ในทางตรงกันข้ามคำว่า "Vanilla JS" ได้รับการประกาศเกียรติคุณสำหรับเว็บไซต์ที่ไม่ใช้ไลบรารีหรือเฟรมเวิร์กใด ๆ แทนที่จะใช้ฟังก์ชัน JavaScript มาตรฐานทั้งหมด [32]

การใช้ JavaScript ได้ขยายไปไกลกว่ารากของเว็บเบราว์เซอร์ เครื่องมือจาวาสคริปต์ที่ฝังตัวอยู่ในขณะนี้ในความหลากหลายของระบบซอฟแวร์อื่น ๆ ทั้งด้านเซิร์ฟเวอร์การใช้งานเว็บไซต์และไม่เบราว์เซอร์การใช้งาน

เริ่มต้นความพยายามที่จะส่งเสริมการใช้งานจาวาสคริฝั่งเซิร์ฟเวอร์เป็นNetscape Enterprise ServerและMicrosoft 's บริการข้อมูลทางอินเทอร์เน็ต , [33] [34]แต่พวกเขาก็ซอกเล็ก ๆ [35]การใช้งานด้านเซิร์ฟเวอร์ในที่สุดก็เริ่มที่จะเติบโตในช่วงปลายยุค 2000 ด้วยการสร้างNode.jsและวิธีการอื่น[35]

มีการใช้ Electron , Cordovaและเฟรมเวิร์กซอฟต์แวร์อื่น ๆเพื่อสร้างแอพพลิเคชั่นจำนวนมากที่มีพฤติกรรมการใช้งานใน JavaScript แอปพลิเคชันอื่น ๆ ที่ไม่ใช่เบราว์เซอร์ ได้แก่Adobe Acrobatรองรับการเขียนสคริปต์เอกสารPDF [36]และส่วนขยายGNOME Shell ที่เขียนด้วย JavaScript [37]

JavaScript เพิ่งเริ่มปรากฏในระบบฝังตัวบางระบบโดยปกติจะใช้ประโยชน์จาก Node.js [38] [39] [40]

React Nativeช่วยให้สามารถสร้างแอพมือถือAndroidและiOSดั้งเดิมที่ใช้ React framework เวอร์ชันที่คล้ายกับเว็บไซต์

คุณลักษณะต่อไปนี้เป็นคุณสมบัติทั่วไปสำหรับการใช้งาน ECMAScript ที่เป็นไปตามข้อกำหนดทั้งหมดเว้นแต่จะระบุไว้อย่างชัดเจนเป็นอย่างอื่น

จำเป็นและมีโครงสร้าง

JavaScript รองรับไวยากรณ์การเขียนโปรแกรมเชิงโครงสร้างจากC (เช่นifคำสั่งwhileลูปswitchงบdo whileลูป ฯลฯ ) ข้อยกเว้นบางส่วนคือการกำหนดขอบเขต : เดิม JavaScript มีฟังก์ชันกำหนดขอบเขตด้วยvar. ECMAScript 2015 เพิ่มคีย์เวิร์ดletและconstสำหรับ block scoping ซึ่งหมายความว่า JavaScript มีทั้งฟังก์ชันและ block scoping เช่น C, JavaScript ทำให้ความแตกต่างระหว่างการแสดงออกและงบ ความแตกต่างทางวากยสัมพันธ์อย่างหนึ่งจาก C คือการแทรกอัฒภาคอัตโนมัติซึ่งอนุญาตให้ละเว้นอัฒภาคที่ปกติจะยุติข้อความได้ [41]

พิมพ์ผิด

จาวาสคริปต์พิมพ์ผิดซึ่งหมายความว่าบางประเภทจะถูกส่งโดยปริยายขึ้นอยู่กับการดำเนินการที่ใช้ [42]

  • ตัว+ดำเนินการไบนารีจะร่ายตัวถูกดำเนินการทั้งสองเป็นสตริงเว้นแต่ว่าตัวถูกดำเนินการทั้งสองจะเป็นตัวเลข เนื่องจากตัวดำเนินการเพิ่มเติมเพิ่มเป็นสองเท่าในฐานะตัวดำเนินการเรียงต่อกัน
  • ตัว-ดำเนินการไบนารีจะเหวี่ยงตัวถูกดำเนินการทั้งสองเป็นตัวเลขเสมอ
  • ตัวดำเนินการยูนารีทั้งสองตัว ( +, -) จะโยนตัวถูกดำเนินการเป็นตัวเลขเสมอ

ค่าจะถูกโยนไปยังสตริงดังต่อไปนี้: [42]

  • สตริงจะถูกปล่อยไว้ตามที่เป็นอยู่
  • ตัวเลขจะถูกแปลงเป็นการแสดงสตริง
  • อาร์เรย์มีองค์ประกอบที่ส่งไปยังสตริงหลังจากนั้นจะรวมกันด้วยเครื่องหมายจุลภาค ( ,)
  • อ็อบเจ็กต์อื่นจะถูกแปลงเป็นสตริง[object Object]โดยที่Objectชื่อของคอนสตรัคเตอร์ของอ็อบเจ็กต์

ค่าจะถูกเหวี่ยงไปที่ตัวเลขโดยการแคสต์ไปยังสตริงจากนั้นแคสต์สตริงให้เป็นตัวเลข กระบวนการเหล่านี้สามารถแก้ไขได้โดยการกำหนดtoStringและvalueOfทำหน้าที่บนต้นแบบสำหรับการหล่อสตริงและตัวเลขตามลำดับ

JavaScript ได้รับการวิพากษ์วิจารณ์ถึงวิธีการดำเนินการแปลงเหล่านี้เนื่องจากความซับซ้อนของกฎอาจเข้าใจผิดว่าไม่สอดคล้องกัน [43] [42]ตัวอย่างเช่นเมื่อเพิ่มตัวเลขลงในสตริงตัวเลขจะถูกส่งไปยังสตริงก่อนที่จะทำการต่อกัน แต่เมื่อลบตัวเลขออกจากสตริงสตริงจะถูกเหวี่ยงเป็นตัวเลขก่อนทำการลบ

บ่อยครั้งที่มีการกล่าวถึงเป็น{} + []ผล0(ตัวเลข) สิ่งนี้ทำให้เข้าใจผิด: {}ถูกตีความว่าเป็นบล็อกโค้ดว่างแทนที่จะเป็นอ็อบเจ็กต์ว่างและอาร์เรย์ว่างจะถูกส่งไปยังตัวเลขโดยตัวดำเนิน+การยูนารีที่เหลือ หากคุณรวมนิพจน์ไว้ในวงเล็บวงเล็บ({} + [])ปีกกาจะถูกตีความว่าเป็นวัตถุว่างและผลลัพธ์ของนิพจน์เป็นไป"[object Object]"ตามที่คาดไว้ [42]

ไดนามิก

กำลังพิมพ์
JavaScript จะ พิมพ์แบบไดนามิกเช่นอื่น ๆ ส่วนใหญ่ ภาษาสคริปต์ ประเภทมีความเกี่ยวข้องกับ ความคุ้มค่ามากกว่าการแสดงออก ยกตัวอย่างเช่น ตัวแปรที่ถูกผูกไว้ในขั้นต้นจะตัวเลขอาจจะมีพระราชเสาวนีย์ให้เป็น สตริง [44] JavaScript สนับสนุนรูปแบบต่างๆในการทดสอบประเภทของวัตถุรวมทั้ง เป็ดพิมพ์ [45]
การประเมินผลรันไทม์
JavaScript มี evalฟังก์ชันที่สามารถดำเนินการคำสั่งที่จัดเตรียมไว้เป็นสตริงในขณะรันไทม์

การวางแนววัตถุ (ตามต้นแบบ)

การสืบทอด Prototypal ใน JavaScript ถูกอธิบายโดยDouglas Crockfordเป็น:

คุณสร้างวัตถุต้นแบบแล้ว ... สร้างอินสแตนซ์ใหม่ ออบเจ็กต์สามารถเปลี่ยนแปลงได้ใน JavaScript ดังนั้นเราจึงสามารถเพิ่มอินสแตนซ์ใหม่ให้ฟิลด์และวิธีการใหม่ ๆ จากนั้นสิ่งเหล่านี้สามารถทำหน้าที่เป็นต้นแบบสำหรับวัตถุที่ใหม่กว่าได้ เราไม่จำเป็นต้องมีคลาสในการสร้างวัตถุที่คล้ายกันมากมาย ... จะมีอะไรเป็นเชิงวัตถุมากกว่านั้น? [46]

ใน JavaScript วัตถุคืออาร์เรย์ที่เชื่อมโยงซึ่งเสริมด้วยต้นแบบ (ดูด้านล่าง) แต่ละคีย์ระบุชื่อสำหรับคุณสมบัติอ็อบเจ็กต์และมีสองวิธีทางเทคนิคในการระบุชื่อดังกล่าว: dot notation ( obj.x = 10) และ bracket notation ( obj['x'] = 10) คุณสมบัติอาจถูกเพิ่มดีดกลับหรือลบออกในขณะทำงาน คุณสมบัติส่วนใหญ่ของอ็อบเจ็กต์ (และคุณสมบัติใด ๆ ที่เป็นของโซ่การสืบทอดต้นแบบของอ็อบเจ็กต์) สามารถแจกแจงได้โดยใช้for...inลูป

ต้นแบบ
JavaScript ใช้ ต้นแบบที่หลายภาษาเชิงวัตถุอื่น ๆ ที่ใช้ ในชั้นเรียนสำหรับ มรดก [47]เป็นไปได้ที่จะจำลองคุณลักษณะต่างๆตามคลาสด้วยต้นแบบใน JavaScript [48]
ทำหน้าที่เป็นตัวสร้างวัตถุ
ฟังก์ชันเป็นสองเท่าของตัวสร้างวัตถุพร้อมกับบทบาททั่วไป คำนำหน้าการเรียกใช้ฟังก์ชันด้วย newจะสร้างอินสแตนซ์ของต้นแบบโดยสืบทอดคุณสมบัติและวิธีการจากตัวสร้าง (รวมถึงคุณสมบัติจาก Objectต้นแบบ) [49] ECMAScript 5 นำเสนอ Object.createวิธีการที่อนุญาตให้สร้างอินสแตนซ์อย่างชัดเจนโดยไม่ต้องสืบทอดจากObjectต้นแบบโดยอัตโนมัติ (สภาพแวดล้อมที่เก่ากว่าสามารถกำหนดต้นแบบให้ null) [50]prototypeคุณสมบัติของตัวสร้างจะ กำหนดวัตถุที่ใช้สำหรับต้นแบบภายในของวัตถุใหม่ วิธีการใหม่สามารถเพิ่มได้โดยการปรับเปลี่ยนต้นแบบของฟังก์ชันที่ใช้เป็นตัวสร้าง ตัวสร้างในตัวของ JavaScript เช่น Arrayหรือ Objectยังมีต้นแบบที่สามารถแก้ไขได้ แม้ว่าจะสามารถปรับเปลี่ยน Objectต้นแบบได้ แต่โดยทั่วไปถือว่าเป็นแนวทางปฏิบัติที่ไม่ดีเนื่องจากวัตถุส่วนใหญ่ใน JavaScript จะสืบทอดวิธีการและคุณสมบัติจาก Objectต้นแบบและอาจไม่คาดว่าจะมีการแก้ไขต้นแบบ [51]
ฟังก์ชั่นเป็นวิธีการ
แตกต่างจากภาษาเชิงวัตถุหลายภาษาไม่มีความแตกต่างระหว่างนิยามฟังก์ชันและ นิยามวิธีการ แต่ความแตกต่างเกิดขึ้นระหว่างการเรียกใช้ฟังก์ชัน เมื่อฟังก์ชันถูกเรียกใช้เป็นวิธีการของอ็อบเจ็กต์คีย์เวิร์ดนี้ของฟังก์ชัน จะถูกผูกไว้กับอ็อบเจ็กต์นั้นสำหรับการเรียกใช้นั้น

การทำงาน

ฟังก์ชั่นเป็นชั้นแรก ; ฟังก์ชันถือเป็นวัตถุ เช่นฟังก์ชั่นอาจมีคุณสมบัติและวิธีการเช่นและ.call() [52]ซ้อนกันฟังก์ชั่นการทำงานที่กำหนดไว้ในฟังก์ชั่นอื่น มันถูกสร้างขึ้นทุกครั้งที่เรียกใช้ฟังก์ชันภายนอก นอกจากนี้ฟังก์ชันที่ซ้อนกันแต่ละฟังก์ชันจะเป็นการปิดคำศัพท์ : ขอบเขตคำศัพท์ของฟังก์ชันภายนอก (รวมถึงค่าคงที่ตัวแปรโลคัลหรือค่าอาร์กิวเมนต์) จะกลายเป็นส่วนหนึ่งของสถานะภายในของอ็อบเจ็กต์ฟังก์ชันภายในแต่ละตัวแม้ว่าการดำเนินการของฟังก์ชันภายนอกจะสิ้นสุดลงก็ตาม . [53] JavaScript นอกจากนี้ยังสนับสนุนฟังก์ชั่นที่ไม่ระบุชื่อ.bind()

ตัวแทน

JavaScript สนับสนุนโดยปริยายอย่างชัดเจนและคณะผู้แทน

หน้าที่ตามบทบาท (ลักษณะและส่วนผสม)
JavaScript natively สนับสนุนการใช้งานฟังก์ชั่นต่างๆของ บทบาท [54]รูปแบบเช่น ลักษณะ [55] [56]และ Mixins [57]ฟังก์ชันดังกล่าวกำหนดพฤติกรรมเพิ่มเติมโดยอย่างน้อยหนึ่งวิธีที่ผูกไว้กับ thisคำสำคัญภายใน functionเนื้อความ จากนั้นบทบาทจะต้องได้รับการมอบหมายอย่างชัดเจนผ่านทาง callหรือ applyไปยังวัตถุที่ต้องแสดงลักษณะการทำงานเพิ่มเติมที่ไม่ได้แชร์ผ่านสายโซ่ต้นแบบ
องค์ประกอบของวัตถุและการสืบทอด
ในขณะที่การมอบหมายตามฟังก์ชันอย่างชัดเจนครอบคลุมการจัด องค์ประกอบใน JavaScript การมอบหมายโดยปริยายจะเกิดขึ้นทุกครั้งที่มีการเดินโซ่ต้นแบบตามลำดับเช่นค้นหาวิธีการที่อาจเกี่ยวข้อง แต่ไม่ได้เป็นของวัตถุโดยตรง เมื่อพบเมธอดแล้วจะถูกเรียกใช้ภายในบริบทของวัตถุนี้ ดังนั้นการ สืบทอดใน JavaScript จึงครอบคลุมโดยระบบอัตโนมัติของการมอบหมายที่ถูกผูกไว้กับคุณสมบัติต้นแบบของฟังก์ชันตัวสร้าง

เบ็ดเตล็ด

JS เป็นภาษาศูนย์ดัชนี

สภาพแวดล้อมรันไทม์
โดยทั่วไป JavaScript อาศัยสภาพแวดล้อมรันไทม์ (เช่น เว็บเบราว์เซอร์ ) เพื่อจัดเตรียมอ็อบเจ็กต์และวิธีการที่สคริปต์สามารถโต้ตอบกับสภาพแวดล้อม (เช่นเว็บเพจ DOM ) สภาพแวดล้อมเหล่านี้เป็นคนเดียว เกลียว JavaScript ยังอาศัยสภาพแวดล้อมรันไทม์เพื่อให้ความสามารถในการรวม / นำเข้าสคริปต์ (เช่น องค์ประกอบHTML

Original text