เมื่อพูดถึงเครื่องหมายคุณสมบัติใน JS ฉันมักจะรู้สึกว่ามันแปลกไปหน่อย ทำไมคุณถึงพูดถึงคุณลักษณะนี้? มันมาจากคำถามเกี่ยวกับปัญหา เราทุกคนรู้ว่าวัตถุหน้าต่างเป็นจริง
เนื่องจากอินสแตนซ์ของหน้าต่างเบราว์เซอร์เป็นอินสแตนซ์อินสแตนซ์นี้ควรมี "คุณสมบัติ" และ "วิธีการ" เช่นต่อไปนี้:
เมื่อเราใช้ฟังก์ชั่นเราจะกำหนดคุณสมบัติบางอย่างเช่นชื่ออายุ ฯลฯ และเรายังสามารถลบตั้งค่าและอัปเดตการดำเนินการบนพวกเขา
คำถามต่อไปนี้คือ เนื่องจากชื่อของวัตถุบุคคลของฉันสามารถแก้ไขได้แบบไดนามิกตามหลักการนี้ฉันควรจะสามารถปรับเปลี่ยนค่าที่ไม่ได้กำหนดไว้ใต้หน้าต่างและจากนั้นฉันก็สนใจที่จะดู
ผลลัพธ์ยังคงเป็นไปได้ ฉันยังไม่ได้แก้ไขค่าที่ไม่ได้กำหนดดังนั้นทำไมสิ่งนี้ถึงเกิดขึ้น? ไม่มีเหตุผล ไม่ใช่ประเภทบรรจุภัณฑ์ที่กล่าวถึงในบทความก่อนหน้า แต่เราต้องเคารพผลลัพธ์ นี่แสดงให้เห็นว่า JS พื้นฐานต้องทำบางสิ่งบางอย่างเพื่อให้ผลลัพธ์ดังกล่าว ในความเป็นจริงใน JS พื้นฐานการเขียนธง = เท็จถูกใช้โดยค่าเริ่มต้นเพื่อให้แอตทริบิวต์ที่ไม่ได้กำหนด ลองดูรายละเอียดด้านล่าง
1: [เขียนได้] คุณสมบัติ
เมื่อพูดถึงว่าแอตทริบิวต์สามารถเขียนได้หรือไม่คุณอาจนึกถึง Accessor Get/Set ใน C# หรือคำหลักแบบอ่านอย่างเดียว ด้านล่างนี้คุณจะสนใจว่าฉันควรดำเนินการอ่านอย่างเดียวของแอตทริบิวต์อย่างแน่นอน ใน JS คุณเพียงแค่ต้องใช้วิธีการแน่นอน
จากตัวอย่างข้างต้นคุณสามารถเห็นสามสิ่งสนุก ๆ :
<1>: ฉันใช้วิธีการแน่นอนเพื่อเปลี่ยนบุคคลชื่อเป็นฟิลด์อ่านอย่างเดียว มีคนต้องการบอกว่านี่เป็นวิธีการที่เห็นได้ชัด แต่มันจะเป็นคุณสมบัติได้อย่างไร? ในใจของฉันคุณลักษณะคือ
โหมด [xxx] ดังนั้นนี่คือความแตกต่างระหว่าง JS ท้ายที่สุดแล้ว JS ไม่มีน้ำตาลวากยสัมพันธ์ดังนั้นลักษณะคำจำกัดความสามารถกำหนดได้ผ่านวิธีการสาธารณะพื้นฐานนั่นคือ DefinEproperty
<2>: ฉันไม่เพียง แต่เห็นการเขียนในวิธีการเท่านั้น แต่ยังสามารถกำหนดค่าได้ แล้วสิ่งนี้มีไว้เพื่ออะไร? ในความเป็นจริงนี่คือการกำหนดค่าพื้นฐานโดยบอก JS Engine ว่าสามารถลบและอัปเดตแอตทริบิวต์ได้หรือไม่ เมื่อฉันตั้งค่าที่กำหนดค่าเป็นเท็จคุณไม่สามารถลบ p.name ได้เนื่องจากนี่จะเป็นการดำเนินการที่ไม่ถูกต้อง
หลังจากอ่านสิ่งเหล่านี้ฉันคิดว่าคุณควรเข้าใจว่าทำไม Unfined ไม่สามารถลบหรืออัปเดตได้ พวกเขาทั้งหมดทำจากเครื่องหมายแปลก ๆ คุณคิดว่ามันน่าสนใจมากหรือไม่?
<3>: คำถามต่อไปที่ควรค่าแก่การคิดคือวิธีที่เครื่องยนต์ JS ทำ นอกจากนี้ยังมีแอตทริบิวต์ใน C#และแอตทริบิวต์นี้จะถูกบันทึกในข้อมูลเมตาหลังจากรวบรวมโดยคอมไพเลอร์ จากนั้นคุณสามารถใช้การสะท้อนกลับเพื่อรับค่าใด ๆ ในแอตทริบิวต์ของคุณ ตัวอย่างเช่นคลาส Serializable Serialization ซึ่งจะบอกวิธีการไตร่ตรองและอ่านคลาสซึ่งเขตข้อมูลซึ่งสามารถทำให้เป็นอนุกรมและไม่สามารถใช้และคุณต้องใช้แท็กที่ไม่ได้ทำ
การคัดลอกรหัสมีดังนี้:
[serializable]
การทดสอบชั้นเรียนสาธารณะ
-
[Nonserialized]
ชื่อสตริงสาธารณะ;
-
จากรูปเราจะเห็นว่าชื่อนั้นไม่ได้เป็นแบบอนุกรมใน IL เรารู้ว่าไม่มีการสะท้อนใน JS ดังนั้นความก้าวหน้าจึงเป็นไปตามธรรมชาติในวิธีการที่แน่นอน น่าเสียดายที่เราไม่สามารถเห็นได้ว่าซอร์สโค้ดพื้นฐานของวิธีนี้เป็นอย่างไรดังนั้นเราจึงไม่รู้ว่ามันทำอะไรกับฟิลด์ชื่อเพื่อให้มันไม่สามารถแก้ไขได้ เราสามารถเดาได้ว่าพฤติกรรมที่อาจเกิดขึ้นในเครื่องยนต์ JS ตามความเข้าใจของเรา