ประเภทอ้างอิง
ประเภทการอ้างอิงส่วนใหญ่รวมถึง: ประเภทวัตถุ, ประเภทอาร์เรย์, ประเภทวันที่, ประเภท regexp, ประเภทฟังก์ชัน ฯลฯ
เมื่อมีการใช้ประเภทการอ้างอิงวัตถุ (อินสแตนซ์) จะต้องสร้างจากพวกเขา กล่าวอีกนัยหนึ่งประเภทการอ้างอิงเทียบเท่ากับเทมเพลต เมื่อเราต้องการใช้ประเภทการอ้างอิงที่แน่นอนเราจำเป็นต้องใช้เทมเพลตนี้เพื่อสร้างวัตถุเพื่อใช้ดังนั้นบางครั้งประเภทการอ้างอิงจึงเรียกว่าคำจำกัดความของวัตถุ
ตัวอย่างเช่นเราจำเป็นต้องสร้างวัตถุบุคคลเพื่อกำหนดข้อมูลส่วนบุคคลและพฤติกรรมของใครบางคนดังนั้นเราจึงต้องพึ่งพาประเภทวัตถุ:
var person = new Object (); person.name = "jiangshui"; person.sayname = function () {console.log (this.name);}วัตถุบุคคลข้างต้นถูกกำหนดโดย "แม่แบบ" โดยใช้ตัวดำเนินการใหม่โดยใช้ประเภทวัตถุ หลังจากนั้นคุณสามารถเพิ่มชื่อแอตทริบิวต์และวิธีการบอกชื่อลงในวัตถุนี้ คุณสมบัติและวิธีการคือ "ฟังก์ชั่น" ของประเภทวัตถุดังนั้นวัตถุที่สร้างผ่านประเภทอ้างอิงเช่นวัตถุสามารถใช้งานได้
การสร้างวัตถุไม่จำเป็นต้องใช้ผู้ให้บริการใหม่ มีบางประเภทที่สามารถทำให้ง่ายขึ้นในการสร้าง ตัวอย่างเช่นการสร้างวัตถุประเภทวัตถุดังกล่าวข้างต้นคุณยังสามารถใช้สองวิธีต่อไปนี้:
var person = {}; person.name = "jiangshui"; person.sayname = function () {console.log (this.name);}หรือ
var person = {ชื่อ: "jiangshui", sayname: function () {console.log (this.name); -ฟังก์ชั่นของตัวดำเนินการ {} เหมือนกับ Object ใหม่ () ซึ่งทำให้การดำเนินการง่ายขึ้น มีความแตกต่างบางประการในวิธีการเขียนสองวิธีข้างต้น อย่างแรกคือ "ผนวก" นั่นคือในคำจำกัดความก่อนหน้านี้ต่อไปเพื่อเพิ่มแอตทริบิวต์หรือวิธีการ หากวิธีแอตทริบิวต์ของชื่อเดียวกันมีอยู่แล้วก่อนหน้านี้จะถูกเขียนทับ ประเภทที่สองคือ "การแทนที่" ซึ่งหมายความว่าไม่ว่าจะมีการกำหนดคุณสมบัติและวิธีการของวัตถุบุคคลมาก่อนหรือไม่วิธีนี้จะแทนที่เนื้อหาที่กำหนดไว้ก่อนหน้านี้ด้วยเนื้อหาที่กำหนดใหม่ เนื่องจากวัตถุที่สร้างขึ้นโดยประเภทการอ้างอิงเป็นภูมิภาคที่เก็บไว้ในหน่วยความจำและจากนั้นตัวชี้ของมันจะถูกบันทึกไว้ในตัวแปรบางตัว (บุคคล) วิธีการเขียนที่สองคือการสร้างวัตถุใหม่ (พื้นที่หน่วยความจำใหม่) จากนั้นชี้ตัวแปรบุคคลไปยังพื้นที่หน่วยความจำใหม่ การทำความเข้าใจสิ่งนี้มีความสำคัญต่อความเข้าใจในภายหลัง
การใช้งานประเภทการอ้างอิงอื่น ๆ นั้นเหมือนกันเช่นประเภทอาร์เรย์ซึ่งสามารถใช้ในการสร้างวัตถุหรือกำหนดโดยตรง หลังจากสร้างวัตถุอาร์เรย์คุณสามารถจัดเก็บเนื้อหาข้อมูลในรูปแบบของอาร์เรย์ นอกจากนี้วัตถุจะได้รับวิธีการที่กำหนดไว้ในประเภทอาร์เรย์เช่นการกด, กะการเรียงลำดับ ฯลฯ และคุณสามารถเรียกวิธีการเหล่านี้เช่น:
var colours = []; colours.push ('สีแดง', 'สีเขียว'); console.log (สี);รหัสด้านบนสร้างวัตถุประเภทอาร์เรย์ผ่านประเภทอาร์เรย์จากนั้นเรียกใช้วิธีการพุชที่กำหนดไว้ก่อนหน้านี้ในประเภทอาร์เรย์เพิ่มค่าสองค่าสีแดงและสีเขียวลงในวัตถุและในที่สุดก็พิมพ์ออกมาบนคอนโซลและคุณสามารถดูได้
โทรและใช้วิธีการ
สองวิธีนี้จัดทำโดยประเภทฟังก์ชันซึ่งหมายความว่าสามารถใช้กับฟังก์ชั่นได้ ฟังก์ชั่นของการโทรเหมือนกับวิธีการใช้ซึ่งก็คือสามารถขยายขอบเขตการทำงานของฟังก์ชั่น ความแตกต่างคือเมื่อใช้การโทรพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชั่นจะต้องแสดงรายการทีละรายการ แต่วิธีการใช้ไม่ได้ใช้ ด้วยวิธีนี้คุณสามารถตัดสินใจใช้การโทรหรือสมัครตามข้อกำหนดของฟังก์ชั่นของคุณเอง
ขอบเขตของการทำงานของฟังก์ชั่นการขยายหมายถึงอะไร? คุณจะเข้าใจโดยยกตัวอย่าง
คุณสามารถเข้าใจด้วยวิธีนี้ว่าฟังก์ชั่นถูกห่อหุ้มด้วยคอนเทนเนอร์ (ขอบเขต) และมีตัวแปรบางอย่างหรือสิ่งอื่น ๆ ในคอนเทนเนอร์นี้ เมื่อฟังก์ชั่นทำงานตัวแปรเหล่านี้เรียกว่า ฯลฯ คุณจะพบสิ่งนี้ในคอนเทนเนอร์ปัจจุบัน คอนเทนเนอร์นี้จะห่อภาชนะขนาดใหญ่ไว้ข้างนอก หากคอนเทนเนอร์ขนาดเล็กปัจจุบันไม่มีมันฟังก์ชั่นจะค้นหาในคอนเทนเนอร์ขนาดใหญ่และอื่น ๆ และค้นหาวัตถุหน้าต่างคอนเทนเนอร์ที่ใหญ่ที่สุด อย่างไรก็ตามหากฟังก์ชั่นทำงานในคอนเทนเนอร์ขนาดเล็กปัจจุบันมีตัวแปรที่สอดคล้องกัน ฯลฯ ในคอนเทนเนอร์ขนาดเล็กแม้ในคอนเทนเนอร์ขนาดใหญ่ฟังก์ชั่นจะยังคงเรียกมันในคอนเทนเนอร์ของตัวเอง
วิธีการโทรและการใช้คือการแก้ปัญหานี้และทำลายข้อ จำกัด ของคอนเทนเนอร์ สำหรับตัวอย่างก่อนหน้า:
var person = {ชื่อ: "jiangshui", sayname: function () {console.log (this.name); -หลังจากเปิดคอนโซลโครเมี่ย
ในเวลานี้บุคคลคือคอนเทนเนอร์ซึ่งสร้างวิธีการ sayname (ฟังก์ชั่น) เมื่อดำเนินการจะต้องดำเนินการภายใต้ขอบเขตของบุคคล เมื่อดำเนินการโดยตรงที่ด้านล่างนั่นคือการดำเนินการภายใต้ขอบเขตของหน้าต่างจะทำให้เกิดข้อผิดพลาดที่ไม่ได้กำหนดไว้เนื่องจากวิธี SayName ไม่ได้กำหนดไว้ด้านล่างหน้าต่าง ตัวชี้ภายในนี้เป็นสิ่งพิเศษซึ่งชี้ไปที่ขอบเขตปัจจุบัน ความหมายของสิ่งนี้ชื่อคือเรียกค่าชื่อด้านล่างขอบเขตปัจจุบัน
ต่อไปเราเพิ่มแอตทริบิวต์ชื่อลงในวัตถุหน้าต่าง:
window.name = "yujiangshui";
หรือโดยตรง
name = "yujiangshui";
เนื่องจากหน้าต่างเป็นภาชนะที่ใหญ่ที่สุดจึงสามารถละเว้นหน้าต่างได้ แอตทริบิวต์หรือตัวแปรที่กำหนดทั้งหมดจะติดอยู่กับหน้าต่าง ถ้าคุณไม่เชื่อคุณจะเห็น:
ตอนนี้เราต้องการเรียกใช้วิธี Sayname ในตู้คอนเทนเนอร์ขนาดเล็กภายใต้คอนเทนเนอร์ขนาดใหญ่ของหน้าต่าง เราจำเป็นต้องใช้การโทรหรือสมัครเพื่อขยายขอบเขตของวิธี Sayname ดำเนินการคำสั่งต่อไปนี้:
person.sayname.call (หน้าต่าง);
หรือ
person.sayname.call (นี่);
ผลลัพธ์ผลลัพธ์จะเหมือนกัน นอกจากนี้คุณยังสามารถใช้งานเพื่อดูเอฟเฟกต์เนื่องจากการสาธิตนี้ง่ายเกินไปและไม่จำเป็นต้องผ่านพารามิเตอร์ดังนั้นฟังก์ชั่นการโทรและการใช้นั้นสอดคล้องกันอย่างสมบูรณ์
ให้ฉันอธิบายรหัสข้างต้น Sayname เป็นอินสแตนซ์แรกของประเภทฟังก์ชันซึ่งมีวิธีการโทรและวิธีการใช้ เนื่องจากวิธีการโทรและการใช้เป็นวิธีการทำงานเราจำเป็นต้องโทรหาบุคคล sayname.call (หน้าต่าง) ด้วยวิธีนี้แทนที่จะเป็น person.sayname () การโทร (หน้าต่าง) และอื่น ๆ
จากนั้นพารามิเตอร์ของการโทรและวิธีการใช้คือขอบเขต (วัตถุ) ซึ่งระบุว่าฟังก์ชั่นก่อนหน้าจะทำงานภายใต้ขอบเขตที่ผ่านเข้ามาหลังจากผ่านวัตถุหน้าต่างเข้ามาชื่อนี้ในวิธีการ SayName ชี้ไปที่ window.name ดังนั้นขอบเขตจะขยาย
ทำไมหน้าต่างผ่านและสิ่งนี้จึงมีเอฟเฟกต์เดียวกัน? เนื่องจากตำแหน่งปัจจุบันของการดำเนินการฟังก์ชั่นนี้คือหน้าต่างดังที่ได้กล่าวไว้ก่อนหน้านี้ตัวชี้นี้ชี้ไปที่ขอบเขตปัจจุบันดังนั้นตัวชี้นี้จึงชี้ไปที่หน้าต่างดังนั้นจึงเท่ากับหน้าต่าง