2012-10-03 55 views
2

如果我創建一個類有兩個方法,像以下:調用JavaScript動態方法,對象

var Car = function() {} 
Car.prototype = { 
    run: function() { 
     alert('run'); 
    }, 
    stop: function() { 
     alert('stop'); 
    } 
} 

而當DOM準備將調用test()方法,
這個test()方法將創建汽車的一個實例,並調用汽車

$(document).ready(function() { 
    test("run"); 
}); 
function test(method) { 
    var instance = new Car(); 
    // call instance.run() 
} 

我知道我必須使用適用的方法()方法,
但我已經試過很多次,失敗
那麼,我如何在Object中使用apply()方法呢?

+0

也許我不明白這個問題,但直接調用'instance.run()'有什麼問題? –

+0

我在這裏錯過了什麼,或者你可以執行'instance.run()'? –

+0

因爲我想用測試(方法)調用不同的方法,所以有時我可以調用test(「run」),有時候測試(「stop」) –

回答

2

javascript中的對象是一個關聯數組,因此您可以使用[]運算符通過字符串來解決對象的任何成員函數。

function test(method) { 
    var instance = new Car(); 
    instance[method](); 
} 

這將允許通過對象Car上的名稱調用函數。

See it working on JsFiddle

被調用方法內的上下文將正確指向新創建的Car實例,而不需要額外的努力,我猜是你想要的。當您需要將默認的「this」值更改爲其他值時,通常使用applycall

+0

非常感謝! –

+0

這是最好的解決方案! –

+0

儘量不要在你的JS代碼中使用「this」和「new」。掌握它的最好方法。 – 2012-10-05 07:45:09

1

我知道我必須使用apply()方法,

你不知道。取消註釋instance.run()代碼,調用test()方法並且它可以工作。

演示:http://jsfiddle.net/JkAnb/

我如何使用對象

這取決於你想要達到什麼樣的應用()方法。有documentation at MDN

1

也許你想打電話

instance.method()

調用動態即基於價值傳遞運行/停止。你可以試試這個 -

實例[方法] .CALL(實例)

實例[方法]。適用(例如)

其中instance作爲作爲要調用的函數範圍的作用域參數傳遞(函數內部的「this」的值)。

-1

此外,你也可以使用eval功能:

var instance = new Car(); 
eval('instance.'+method+'();'); 

雖然菲菲Pollano的方式是很整齊海事組織。

http://jsfiddle.net/VZdXb/

0

爲什麼你需要在(基於對象的)功能性的語言類? 你的意圖有點不清楚。測試函數中的參數'method'的隱含類型是什麼? 我假設它是一個方法名稱。無論如何,代碼可能會有所幫助。

/* prefer this class pattern */ 
var Car = (function() { 
    "use strict"; 
    Car.prototype = { 
     name : undefined , 
     run: function() { 
      return name_ + ":: run"; 
     }, 
     stop: function() { 
      return name_ + ":: stop"; 
     } 
    }; 
    /* constructor */ 
    function Car(name) { 
     name_ = name; 
    } 
    return Car; 
})(); 
function printer(msg_) { 
    document.body.innerHTML += msg_ + "<br/>"; 
} 
function test(car_, method_name_1, method_name_2) { 
     printer(car_[method_name_1]()); 
     printer(car_[method_name_2]()); 
} 
test(new Car("BMW"), "run", "stop"); 
test(new Car("Lada"), "run", "stop")