Javascript เรียกใช้เมธอดอ็อบเจ็กต์แบบไดนามิกจากสตริง


97

ฉันสามารถเรียกเมธอดอ็อบเจ็กต์แบบไดนามิกโดยมีชื่อเมธอดเป็นสตริงได้หรือไม่ ฉันจะจินตนาการได้ดังนี้:

var FooClass = function() {
    this.smile = function() {};
}

var method = "smile";
var foo = new FooClass();

// I want to run smile on the foo instance.
foo.{mysterious code}(); // being executed as foo.smile();

คำตอบ:


214

หากชื่อของคุณสมบัติถูกเก็บไว้ในตัวแปรให้ใช้ []

foo[method]();

2
มันใช้งานไม่ได้สำหรับฉันโดยใช้ตัวแปรภายในฟังก์ชัน: const genericResolver = (table, action, values) => {return Auth.isAuthenticated () .then (() => {return eval (table) .findAll ()
stackdave

หากคุณต้องการเรียกใช้เมธอดจากเมธอดอื่นภายในคลาสให้ใช้ ['methodName'] () นี้
schlingel

2
ได้รับข้อผิดพลาดที่น่าเกลียดนี้Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'ใคร ๆ ?
Anand Rockzz

33

คุณสมบัติของวัตถุสามารถเข้าถึงได้ผ่านสัญกรณ์อาร์เรย์:

var method = "smile";
foo[method](); // will execute the method "smile"

4

วิธีการโทรด้วย eval eval("foo." + method + "()"); อาจไม่ใช่วิธีที่ดีนัก


ประโยชน์ในกรณีของฉันที่fooเป็น{ fields: [{ id: 1 }] }และmethodเป็นfields[0]?.idแต่ผมจะลบออก()จากคำตอบที่คุณเสนอ
Rorrim

4

เมื่อเราเรียกใช้ฟังก์ชันภายในออบเจ็กต์เราจำเป็นต้องระบุชื่อของฟังก์ชันเป็นสตริง

var obj = {talk: function(){ console.log('Hi') }};

obj['talk'](); //prints "Hi"
obj[talk]()// Does not work

2
การให้ความเห็นกับโค้ดของคุณเป็นประโยชน์เสมอเพื่อให้สามารถเข้าใจได้จากบริบท
Phil Cooper

เพิ่มความคิดเห็น ขอบคุณ!
SN

0

ฉันอยากจะฝากตัวอย่างไว้ที่นี่สำหรับเรื่องนี้ ตัวอย่างเช่น; ฉันต้องการเรียกใช้วิธีการตรวจสอบแบบไดนามิกในขณะที่ส่งแบบฟอร์ม

<form data-before-submit="MyObject.myMethod">
    <button type="submit">Submit</button>
</form>
$('form').on('submit', function(e){

    var beforeSubmit = $(this).attr('data-before-submit');

    if( beforeSubmit ){

       params = beforeSubmit.split(".");
       objectName = params[0];
       methodName = params[1];

       result = window[objectName][methodName]($(this));

       if( result !== true ){
           e.preventDefault();
       }

    }

});

var MyObject = {
    myMethod = function(form){
        console.log('worked');
        return true;
    }
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.