การใช้งาน 1 (การใช้งานทั่วไป):
นิพจน์คือ: object.method.call(วัตถุอื่น) ซึ่งหมายถึงการแทนที่วัตถุปัจจุบันด้วยวัตถุอื่นและดำเนินการวิธีการของวัตถุปัจจุบัน ลองดูตัวอย่างก่อน:
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น Class1(){
this.name = "class1";
this.showName = ฟังก์ชั่น(){
การแจ้งเตือน (this.name);
-
-
ฟังก์ชั่น Class2(){
this.name = "class2";
-
var c1 = ใหม่ Class1();
var c2 = ใหม่ Class2();
c1.showName.call(c2);
c2.showName(); //ไม่สามารถดำเนินการได้
ขั้นแรกเรากำหนดฟังก์ชันสองรายการตามลำดับ คือ Class1 และ Class2 ความแตกต่างที่สำคัญระหว่างฟังก์ชันทั้งสองคือ Class2 มีเมธอด showName() มากกว่า Class1 หนึ่งรายการ จากนั้นจึงกำหนดอ็อบเจ็กต์ c1 และ c2 ที่สอดคล้องกับ Class1 และ Class2 ในเวลานี้ เรารู้ชัดเจนว่า c1 มีเมธอด showName() แต่ c2 ไม่มี แต่ปาฏิหาริย์ก็เกิดขึ้น เมื่อเรารัน c1.shoName.call(c2) ค่าชื่อของ c2 จะปรากฏขึ้น ซึ่งก็คือ "class2" ที่จริงแล้ว เรายังคงดำเนินการเมธอดของ c1 แต่เราเพิ่งแทนที่อ็อบเจ็กต์ c2 ด้วยอ็อบเจ็กต์ c1 ชั่วคราว หลังจากดำเนินการแล้ว มันยังคงเหมือนเดิมเมื่อถูกกำหนดไว้ และ c2 ไม่มีเมธอดอีกต่อไป เพื่อตรวจสอบว่า c2 มีเมธอดเพิ่มเติมหรือไม่ ตัวอย่างจะเพิ่มบรรทัด c2.showNmae(); ไม่สามารถดำเนินการได้ และเบราว์เซอร์จะรายงานข้อผิดพลาด Object #<Class2> ไม่มีเมธอด 'showName'
ทำไมทำเช่นนี้? ดังที่ได้กล่าวไปแล้ว นี่เป็นวิธีการใช้งานชั่วคราว เราเพียงใช้เพื่อการเขียนโปรแกรมที่มีประสิทธิภาพเท่านั้น แต่นี่ไม่ใช่ข้อจำกัด สมมติว่า c1 และ c2 ถูกใช้เพื่อแสดงวัตถุที่ถูกแทนที่และวัตถุที่ถูกแทนที่ และ fun1 ถูกใช้เพื่อแสดงวิธีการโดยธรรมชาติของ c1 1. เมื่อ fun1 ไม่ต้องการพารามิเตอร์และไม่ได้ใช้ตัวแปรท้องถิ่นใดๆ ในฟังก์ชันพาเรนต์ จริงๆ แล้วไม่มีความแตกต่างระหว่าง c1.fun1.call(c2) และ c1.fun1(); 2. เมื่อ fun1 ไม่ต้องการพารามิเตอร์ ใช้ตัวแปรฟังก์ชันพาเรนต์ จากนั้นจึงจำเป็นต้องสร้างตัวแปรที่ใช้โดย fun1 ด้วยชื่อเดียวกันในฟังก์ชันของ c1 และ c2 3. เมื่อ fun1 ต้องการพารามิเตอร์ จะต้องเขียนแบบฟอร์มใหม่เป็น c1.fun1.call(c2 , พารามิเตอร์ 1, พารามิเตอร์ 2, ...พารามิเตอร์ n) ในขณะนี้ ชื่อตัวแปรในฟังก์ชันที่สร้าง c1 ไม่จำเป็นต้องชื่อเดียวกันกับชื่อตัวแปรในฟังก์ชันที่สร้าง c2 เพียงแต่ต้องสอดคล้องกันเท่านั้น ในความเป็นจริง เมื่อเราใช้ call c2 และ c1 มักจะมีโครงสร้างและฟังก์ชันที่คล้ายคลึงกันมาก ดังนั้นสามประเด็นข้างต้นจึงหลีกเลี่ยงได้ง่าย
การใช้งานที่สอง:
ใช้ในระหว่างกระบวนการนิยามฟังก์ชัน ในรูปแบบของ: function.call(this) ที่มีอยู่อื่น ซึ่งสามารถโคลนตัวแปรและวิธีการทั้งหมดของฟังก์ชันอื่นที่มีอยู่ให้เป็นฟังก์ชันของตัวเอง เพื่อให้ได้ฟังก์ชันที่คล้ายกับการสืบทอด ลองดูตัวอย่าง:
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่นสัตว์ (ชื่อ) {
this.name = ชื่อ;
this.showName = ฟังก์ชั่น(){
การแจ้งเตือน (this.name);
-
-
var animal = สัตว์ใหม่ ("small_animal");
animal.showName(); //alert("small_animal")
ฟังก์ชั่น Cat (ชื่อ) {
Animal.call(นี่, ชื่อ);
-
//var Animal = null; //ไม่ใส่เครื่องหมายข้อคิดเห็นแล้วลองดู
var cat = แมวใหม่ ("black_cat");
cat.showName(); //alert("black_cat")