เว็บสำเร็จรูป เว็บสำเร็จรูปภาครัฐ เว็บโรงเรียน เว็บไซต์ส่วนตัว ระบบบริหารจัดการเว็บไซต์ (CMS) ฟรี

จะเรียก method ข้าม class จาก string ได้ยังไง

สวัสดีครับคุณอา

ผมห่างไปนานมากกับเรื่องทำเว็บ วันนี้ผมมีโปรเจ็คท์เว็บแอพพลิเคชั่นที่ใช้รวมกับอุปกรณ์ IoT อันนี้ทำสนุกๆ ใช้ส่วนตัว พอดีติดปัญหาเรื่องการเรียก method ข้าม class โดยผ่านการรับค่าจากตัวแปรนิดหน่อยจึงอยากเรียนถามคุณอาครับ



เกริ่นนำ :

ผมสร้าง class ขึ้นมาหลายตัว โดยแต่ละ class มี method อีกหลายตัวเช่นกันซึ่งมีทำหน้าที่แตกต่างกันไปตามคลาสนั้นๆ แต่มี class หนึ่งตัว ที่มี method สำคัญในการรับค่า array ซึ่ง key แรกเป็นตัวระบุว่าจะเรียกไปยัง class ไหน ใน key ที่สองเป็นตัวระบุว่าจะเรียก method ตัวใดของ class ที่ระบุมาจาก key แรก ใน key ที่สามคือ argument ที่ส่งให้กับ method ใน class นั้นอีกทีครับ

เมื่อเอาค่าทั้งหมดมารวมกันจะออกมาหน้าตาประมาณนี้ classA.prototype.methodA(Agu); เหมือนการเรียก public method ทั่วไป



ความต้องการ & ปัญหา :

จากค่าที่รับมาใน class&method หนึ่ง นำมากมาแยกเพื่อจะเรียก class และ method แบบ dynamic ปัญหาคือเมื่อแยกออกมาแล้วอยู่ในรูปแบบของ string ยังไม่สามารถเรียก class และ method ใดๆ ได้เลย ผมลองหาตามเว็บต่างๆ ซึ่งมีตัวอย่างในการเรียก function จาก string แต่นำโค้ดมาลองปรับใช้ดูจากหลายๆ ตัวอย่างแล้วยังไม่ได้ผลครับ อาจเพราะแตกต่างจากการเรียก function ก็เป็นได้ครับ เหมือนเห็นว่าทางข้างหน้าจะไปต่อยังไงแต่ต้องหยุดเพราะเจอรั้วไฟฟ้าก้นเอาไว้ทำให้ไปต่อไม่ได้ TT-TT



รูปแบบที่เขียนไว้จะเป็นประมาณนี้ครับ

[JavaScript]

classA.prototype.methodA(){

var a = this.valA.split(" ");

var b = a[0] + '.prototype.' + a[1];



window.settings = {functionName: b};

var c = window[settings.b];

if(typeof c === 'function') c(a[2]);

}



B.prototype.methodA(){

......

}

B.prototype.methodB(){

......

}

B.prototype.methodC(){

......

}

C.prototype.methodA(){

......

}

C.prototype.methodB(){

......

}



ก่อนหน้านี้ใช้ if / switch มาเป็นตัวตรวจสอบเงื่อนไข แต่พบปัญหาว่าทั้งสอง ต้องระบุไว้ล่วงหน้าให้ครบทุก class ทุก method ซึ่งมันเยอะมาก แล้วทำให้โค้ดยาวโดยใช่เหตุ



สุดท้ายเลยต้องหาที่พึ่งสอบถามใครสักคนจนได้มาขอความช่วยเหลือจากคุณอาครับ ยังไงขอขอบคุณไว้ ณ ที่นี้ครับ ^^





#update :

ตอนนี้แก้ไขโดยใช้คำสั่ง

var a = this.valA.split(" ");

var x = n[2] ? n[2] : '';

eval(a[0] + '.prototype.' + a[1] + '("' + x + '")');



ด้วยข้อจำกัดคือ ต้องพิมพ์เป็นคำสั่งเพื่อสั่งงานเท่านั้น (เหมือนพิมพ์คำสั่งใน terminal)

หากมี string ที่เป็นคำสั่งอันตรายลักลอบส่งเข้ามาให้ eval() โดยบุคคลอื่นอาจมีปัญหาได้

เห็นฝรั่งเข้าบอกว่า This can be dangerous if you’re taking user input and running it through eval(). จึงอยากขอวิธีที่หลีกเลี่ยง eval และ exe ครับ
01 พ.ค. 2559 1 2,211

ตกลงเป็นคำถามหรือบ่นเฉยๆ .... มีหลายวิธีในการเรียกฟังก์ชั่นจาก string อยากรู้ลองไปแงะ javascript framework



Function.prototype.bind = function (o) {

var __method = this;

return function () {

return __method.apply(o, arguments);

};

};


เวลาใช้

var f = function(){};

f.bind();


การทดสอบว่าเป็นฟังก์ชั่นหรือไม่

window['functionname']


การเรียกฟังก์ชั่น ลองใช้

new Function();


จริงๆแล้ว มันขึ้นกับวิธีเขียนนะว่าออกแบบไว้ยังไง ถ้าออกแบบไว้ดีๆการเรียกก็ง่าย อาจตอบไม่ได้ชัดเจนนะ เอาไปเป็นแนวทางละกัน

ปล. วิธีไหนๆมันก็ไม่ปลอดภัยทั้งนั้นแหละ เพราะถ้า argument ส่งมาเป็นชื่อฟังก์ชั่น เขาก็อาจส่งค่าอะไรมารันก็ได้ วิธีที่ถูกต้อง ถึงจะยาวหน่อยแต่ก็ดีที่สุดคือ กำหนดฟังก์ชั่นที่สามารถเรียกใช้ได้ไปเลย จะปลอดภัยที่สุด ... เขียน if มันยาวก็เขียน array ดิ
#1
ความคิดเห็น
ไฟล์อัปโหลด ชนิด jpg, jpeg, png, webp ขนาดไฟล์ไม่เกิน 2M
^