Javascript tự động gọi phương thức đối tượng từ chuỗi


94

Tôi có thể gọi động một phương thức đối tượng có tên phương thức là một chuỗi không? Tôi sẽ tưởng tượng nó như thế này:

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();

Câu trả lời:


211

nếu tên của thuộc tính được lưu trữ trong một biến, hãy sử dụng []

foo[method]();

1
nó không hoạt động đối với tôi khi sử dụng một biến bên trong một hàm: const genericResolver = (table, action, values) => {return Auth.isAuthenticated () .then (() => {return eval (table) .findAll ()
stackdave

Nếu bạn muốn thực thi một phương thức từ một phương thức khác bên trong một lớp, hãy sử dụng ['methodName'] () này.
schlingel

2
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'FooClass'ai khác mắc phải lỗi xấu xí này không?
Anand Rockzz

33

Các thuộc tính của các đối tượng có thể được truy cập thông qua ký hiệu mảng:

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

3

phương thức có thể được gọi với eval eval("foo." + method + "()"); có thể không phải là cách rất tốt.


Hữu ích trong trường hợp của tôi ở đâu foo{ fields: [{ id: 1 }] }methodfields[0]?.id, nhưng tôi đã phải gỡ bỏ ()từ câu trả lời đề nghị của bạn
Rorrim

3

Khi chúng ta gọi một hàm bên trong một đối tượng, chúng ta cần cung cấp tên của hàm dưới dạng một Chuỗi.

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

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

2
Luôn hữu ích khi cung cấp một số bình luận với mã của bạn để nó có thể được hiểu theo ngữ cảnh.
Phil Cooper

Đã thêm một số bình luận. Cảm ơn!
sn

-1

Tôi muốn để lại một ví dụ ở đây cho điều này. Ví dụ; tôi muốn gọi một phương pháp kiểm tra động trong khi gửi biểu mẫu.

<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;
    }
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.