มาลองตัวอย่างก่อน:
// poisoning object.prototypeobject.prototype.bar = 1; var foo = {moo: 2}; สำหรับ (var i ใน foo) {console.log (i); // พิมพ์ทั้งแถบและ moo}เราต้องให้ความสนใจกับสองจุดที่นี่ หนึ่งคือว่าสำหรับการวนรอบจะเพิกเฉยต่อแอตทริบิวต์ที่ตั้งไว้เป็นหนังสือที่ผิดพลาด ตัวอย่างเช่นคุณสมบัติความยาวของอาร์เรย์ ประการที่สองเนื่องจากใน Will จะสำรวจห่วงโซ่ต้นแบบทั้งหมดเมื่อห่วงโซ่ต้นแบบยาวเกินไปมันจะมีผลกระทบต่อประสิทธิภาพ
การระบุเป็นคำที่แปลกมาก ในความเป็นจริงมันเป็นเรื่องยากสำหรับคุณที่จะค้นหาเงาใน JavaScript และจริง ๆ แล้วยืมมาจากผู้เขียนจาก Ruby จุดประสงค์ในการสร้างสิ่งที่แจกแจงได้นั้นไม่ได้ใช้อย่างอิสระ แต่เพื่อใช้วิธีการ "ผสม" วิธีการหลายวิธีในการใช้งานต้นแบบใช้งานได้ดังนั้นจึงสามารถกล่าวได้ว่าเป็นรากฐานที่สำคัญของต้นแบบ ฉันจะไม่ให้คำแนะนำโดยละเอียดที่นี่โปรดดูรายละเอียด - ระบุได้
เนื่องจากเราไม่สามารถเปลี่ยนพฤติกรรมของ For In Loop ได้เราจึงสามารถใช้วิธีอื่น ๆ ในการกรองคุณสมบัติที่ไม่ต้องการปรากฏในลูป ผ่าน "JavaScript Learning Notes Objects (III): HasownProperty" เรารู้ว่าวิธี HasownProperty สามารถทำได้
ตัวกรองโดยใช้ hasownproperty
ยังคงใช้ตัวอย่างก่อนหน้า:
// poisoning object.prototypeobject.prototype.bar = 1; var foo = {moo: 2}; สำหรับ (var i ใน foo) {ถ้า (foo.hasownproperty (i)) {console.log (i); -นี่เป็นวิธีเดียวที่ถูกต้องในการเขียน เนื่องจากเราใช้วิธี HasownProperty เราจะส่งออกเฉพาะ MOO ในครั้งนี้ หากวิธีการ HasownProperty ไม่สามารถใช้งานได้ข้อผิดพลาดจะปรากฏขึ้นเมื่อ Extended Object.prototype
ตอนนี้เฟรมเวิร์กจำนวนมากเลือกที่จะขยายวิธีการจาก Object.prototype ดังนั้นเมื่อเราใช้เฟรมเวิร์กเหล่านี้เราจะพบปัญหาหากเราใช้ A สำหรับการวนรอบที่ไม่ได้กรองด้วย HasownProperty
สรุป
ขอแนะนำให้พัฒนานิสัยที่ดีของคุณสมบัติการกรอง HasownProperty อย่าตั้งสมมติฐานใด ๆ เกี่ยวกับสภาพแวดล้อมการทำงานโดยไม่คำนึงว่าวัตถุต้นแบบดั้งเดิมจะขยายออกไปหรือไม่