我是网络开发的新手。 今天我在javascript中学习了类(函数)。我得到一个错误如何调用动态添加的方法。
我的代码:
<head runat="server">
<title></title>
<script type="text/javascript" language="javascript">
function MyMethod(name, fn) {
var str = "MyFunction1.prototype." + name + "= fn;";
eval(str);
}
function MyFunction1() {
MyMethod("start", function () { return "hi"; });
var abc = this.start(); //gives error
}
</script>
</head>
<body>
<form id="form1" runat="server" >
<div>
<input type="button" value="Click" onclick="MyFunction1()"/>
</div>
</form>
这里当我点击输入按钮然后无法调用动态添加的功能时 我怎样才能调用我在这里添加的start()函数。
请帮帮我。 在此先感谢。
答案 0 :(得分:3)
this
中的MyFunction1
在这种情况下引用全局对象(对于浏览器为window
),因为您将MyFunction1
称为函数,您不使用new MyFunction1()
创建对象。
另一件值得注意的事情。如果可以在没有eval的情况下执行,则不应使用eval
。
你可以使用以下方法做同样的事情:
function MyMethod(name, fn) {
MyFunction1.prototype[name] = fn;
}
使用eval
会阻止您使用优化工具或工具来验证代码。至少大多数这些工具都不会考虑eval
,甚至会对您使用它的情况发出警告。
答案 1 :(得分:1)
尝试在对MyFunction1进行onclick调用之前添加“new”,创建一个实例。
答案 2 :(得分:1)
它解决了我做过
嗨,它解决了。谢谢我的帮助:
function fnOnload() {
MyMethod("start", function () { return "hi"; });
}
function MyMethod(name, fn) {
var str = "MyFunction1.prototype." + name + "= fn;";
eval(str);
}
function MyFunction1() {
}
function MyFunction2()
{
var aa = new MyFunction1();
var answee = aa.start();
}
并点击按钮i调用函数MyFunction2()
答案 3 :(得分:1)
在不更改代码的情况下,您可以按照以下步骤进行操作,但我说如果您阅读有关调用类型和此变量的内容将会有所帮助。
function MyMethod(name, fn) {
MyFunction1.prototype[name]= fn;
return MyFunction1.prototype;
}
function MyFunction1() {
var myPrototype= MyMethod("start", function () { return "hi"; });
var returnValue = myPrototype.start();
console.log(returnValue);
}