如果我使用以下两种方法创建一个类:
var Car = function() {}
Car.prototype = {
run: function() {
alert('run');
},
stop: function() {
alert('stop');
}
}
当DOM准备就绪时,将调用test()方法,
并且这个test()方法将创建Car的实例并调用Car的方法
$(document).ready(function() {
test("run");
});
function test(method) {
var instance = new Car();
// call instance.run()
}
我知道我必须使用apply()方法,
但我已经尝试了很多次但都失败了
那么,我如何在Object中使用apply()方法?
答案 0 :(得分:2)
javascript中的对象是一个关联数组,因此您可以使用[]
运算符通过字符串来解析对象的任何成员,也可以运行。
function test(method) {
var instance = new Car();
instance[method]();
}
这将允许通过名称在对象Car上调用函数。
被调用方法中的上下文将正确地指向新创建的Car实例而无需任何额外的努力,我想这就是你想要的。当您需要将默认的“apply
”值更改为其他值时,通常会使用call
或this
。
答案 1 :(得分:1)
我知道我必须使用apply()方法,
你没有。取消注释instance.run()代码,调用test()方法并且它可以工作。
如何在Object
中使用apply()方法
这取决于你想要达到的目标。有documentation at MDN。
答案 2 :(得分:1)
也许你想打电话
instance.method()
动态调用,即基于传递的运行/停止值。你可以试试这个 -
实例[方法] .CALL(实例)
或
实例[方法]。适用(例如)
其中instance作为作为要调用的函数范围的作用域param传递(函数内部的“this”的值)。
答案 3 :(得分: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")
答案 4 :(得分:-1)
此外,您还可以使用eval
功能:
var instance = new Car();
eval('instance.'+method+'();');
虽然菲利斯·波拉诺的方式远非整齐。