<script> ฟังก์ชั่น p () {var len = arguments.length; สำหรับ (var i = 0; i <len; i ++) {document.write (อาร์กิวเมนต์ [i]+"<br/>"); }} ฟังก์ชั่น myclass (x, y) {this.x = x; this.y = y; this.show = function () {return this.x+this.y; }} var m1 = myclass ใหม่ (1,2); var m2 = myclass ใหม่ (3,4); p (m1.show (), m2.show ()); </script>ปัญหาที่มีอยู่
1. เนื่องจากทุกอินสแตนซ์การคัดลอกเอนทิตีที่กำหนดโดยวิธีเดียวกันประสิทธิภาพ (ประสิทธิภาพของหน่วยความจำและการดำเนินการที่ไม่มีประสิทธิภาพ) สามารถแก้ไขได้ผ่านการสืบทอดต้นแบบ
2. ไม่สามารถเข้าถึงการควบคุมค่าแอตทริบิวต์ (ส่วนตัวสาธารณะ) สามารถแก้ไขได้ผ่านการปิด
วัตถุการดำเนินการที่เข้าถึงโดยแอตทริบิวต์ไม่ใช่ตัวแปร แต่เป็นการอ้างอิงถึงวัตถุ
การประมวลผลการอ่านเฉพาะส่วนจำนวนเต็มของค่าตัวเลข
คณิตศาสตร์ [สิ่งนี้ <0? 'celling': 'floor'] (นี่);
อาร์เรย์เชื่อมโยง
ใน JS คุณต้องผ่านวัตถุเพื่อใช้อาร์เรย์เชื่อมโยง
การดำเนินการขั้นพื้นฐานทำโดยกุญแจการตั้งค่าองค์ประกอบและการลบองค์ประกอบ
<script> var map = {x: 3, y: 4}; p (map.x); ลบ map.x; //truep(map.x); // ไม่ได้กำหนดผลลัพธ์ของการเข้าถึงองค์ประกอบที่ไม่มีอยู่นั้นไม่ได้กำหนดไว้ เนื่องจากค่าสามารถตั้งค่าให้ไม่ได้กำหนดจึงเป็นไปไม่ได้ที่จะตัดสินว่าค่ามีอยู่หรือไม่โดยการเปรียบเทียบค่ากับ undefined คุณสามารถระบุได้โดยสำหรับใน a = 'undefined'; p (a); // undefinedp (typeof map.x == a); // true </script>ในฐานะที่เป็นอาร์เรย์ที่เชื่อมโยงคุณควรให้ความสนใจกับ
<script> ฟังก์ชั่น myclass (x, y) {this.x = x; this.y = y;} myclass.prototype.z = 5; var obj = myclass ใหม่ (1,2); สำหรับ (var key ใน obj) {p (key+":"+obj [key]); // แอตทริบิวต์ที่สืบทอดผ่านต้นแบบจะถูกแจกแจง} // x: 1 y: 2 z: 5delete obj.x; // truep (obj.x); //undefinedp(obj.z); // 5 // แอตทริบิวต์ที่สืบทอดผ่านต้นแบบไม่สามารถลบลบ obj.z; //truep(obj.z);//5///when เมื่อใช้วัตถุเป็นอาร์เรย์ที่เชื่อมโยงกันมักจะถูกสร้างขึ้นตามตัวอักษร แม้ว่ามุมมองจะใช้วัตถุเปล่าตามตัวอักษรเพื่อสร้างอาร์เรย์เชื่อมโยงโดยไม่มีองค์ประกอบ แต่แอตทริบิวต์ของต้นแบบ P ('toString' ใน OBJ); // TrueVar obj1 = {}; p ('toString' ใน obj1); // true // enumenp (obj1.length); // undefinedfor (var k ใน obj1) {p (obj1 [k]);} // ไม่มีองค์ประกอบที่แจกแจง นี่เป็นเพราะแอตทริบิวต์ enumerable //truevar obj1 = {}; p ('toString' ใน obj1); // true // enum การแจงนับของ p (obj1.length); // undefinedfor (var k ใน obj1) {p (obj1 [k]);} // ไม่มีองค์ประกอบที่แจกแจง นี่เป็นเพราะแอตทริบิวต์ enumerable //truevar obj1 = {}; p ('toString' ใน obj1); // true // แอตทริบิวต์เหมือนตัวเองที่สืบทอดมาโดยการมีส่วนร่วมในแผนที่ต้นแบบ = {}; p (map.hasownproperty ('tostring'); //falsemap ['toString'.k=1;p(map.hasownproperty('ToString ')); // truedelete map ['toString']; p (map.hasownproperty ('toString')); // false </script>คุณลักษณะ
คุณลักษณะของวัตถุยังมีคุณลักษณะบางอย่าง
ตารางต่อไปนี้สรุปแอตทริบิวต์ที่กำหนดไว้ใน ECMAScript รุ่นที่ห้าและค่าแอตทริบิวต์ถูกกำหนดเป็นแอตทริบิวต์ค่า
ตารางที่ 1
ชื่อแอตทริบิวต์ | ความหมาย |
เขียนได้ | ค่าของแอตทริบิวต์สามารถเขียนใหม่ได้ |
ซึ่งแจกแจงได้ | สามารถแจกแจงโดยสำหรับใน |
กำหนดได้ | คุณสามารถเปลี่ยนแอตทริบิวต์และลบแอตทริบิวต์ |
รับ | ฟังก์ชั่น getter ที่ระบุค่าคุณสมบัติ |
ชุด | ฟังก์ชัน setter ที่สามารถระบุค่าแอตทริบิวต์ |
วัตถุที่ไม่เปลี่ยนรูป
นั่นคือวัตถุที่ไม่สามารถเปลี่ยนแปลงสถานะได้หลังจากการสร้างและวัตถุสตริงเป็นวัตถุที่ไม่เปลี่ยนรูปแบบทั่วไป
การใช้วัตถุที่ไม่เปลี่ยนรูปแบบสามารถปรับปรุงความทนทานของโปรแกรมได้อย่างยืดหยุ่นเช่นเมื่อส่งผ่านไปยังพารามิเตอร์วิธีการมีวิธีการเขียนเนื้อหาวัตถุ ฯลฯ ฯลฯ
วัตถุที่ไม่เปลี่ยนรูปสามารถนำไปใช้ใน JS ได้
1. ซ่อนแอตทริบิวต์ (สถานะซ่อน) และไม่ให้การดำเนินการเปลี่ยนแปลง (การปิดการใช้งาน)
2. การใช้ฟังก์ชั่นที่ยืดหยุ่นได้อย่างยืดหยุ่นโดย Ecmascript ในรุ่นที่ห้า
3. การใช้แอตทริบิวต์ที่สามารถเขียนได้อย่างยืดหยุ่นได้กำหนดค่าตัวตั้งค่าและ getters
ฟังก์ชั่นที่ใช้เพื่อรองรับวัตถุที่ไม่เปลี่ยนรูปใน ECMASCRIPT เวอร์ชัน 5 จะแสดงในตารางต่อไปนี้
ชื่อวิธี | คุณลักษณะใหม่ | การลบแอตทริบิวต์ | การเปลี่ยนค่าแอตทริบิวต์ | วิธีการยืนยัน |
preventextensions | x | โอ | โอ | Object.isextensible |
ผนึก | x | x | โอ | Object.iseled |
แช่แข็ง | x | x | x | Object.isfrozen |
Object.preventExtensions ตัวอย่าง
<script> var obj = {x: 2, y: 3}; object.preventextensions (obj); // ไม่สามารถเพิ่มแอตทริบิวต์ obj.z = 4; p (object.keys (obj)); // x, y // ไม่สามารถลบแอตทริบิวต์ obj.y; p (object.keys (obj)); // x // ไม่สามารถเพิ่มค่าแอตทริบิวต์ obj.x = 20; p (obj.x); //20//object.seal ตัวอย่างตั้งค่าที่กำหนดค่าของแอตทริบิวต์เป็นเท็จ var obj = {x: 2, y: 3}; object.seal (obj); // ไม่สามารถเพิ่มหรือลบ obj.z = 3; p (object.keys (obj)); // x, ydelete obj.x; //falsep(Object.keys(Obj));//x,y//can เปลี่ยนค่าแอตทริบิวต์ obj.x = 20; p (obj.x); // 20 // วัตถุตัวอย่างที่ตั้งค่าไว้ของแอตทริบิวต์ที่เป็นเท็จ obj.z = 3; p (object.keys (obj)); // x, y // สามารถเปลี่ยนค่าแอตทริบิวต์ obj.x = 20; p (obj.x); // 20 </script>ต้องให้ความสนใจ
1. สำหรับสามวิธีข้างต้นไม่สามารถกู้คืนได้เมื่อมีการเปลี่ยนแปลง
2. หากคุณต้องการสร้างวิธีการที่สืบทอดมาในการสืบทอดต้นแบบไม่เปลี่ยนแปลงคุณต้องแสดง