我只是编写一个测试html文件来了解javascript中的对象。代码如下
脚本标记中的
<script type="text/javascript">
var obj = new ParentFn();
var obj2 = new AnotherParentFn();
var temp;
function initer()
{
temp = obj.Adding();
obj2.caller();
}
function ParentFn()
{
this.a = 10;
this.b = 20;
}
function AnotherParentFn()
{
this.a = 30;
this.b = 50;
}
AnotherParentFn.prototype.caller = function()
{
var self = this;
temp();
}
ParentFn.prototype.Adding = function()
{
var self = this;
document.getElementById("id_div1").innerHTML = " Method Called and Result of a+b is " + (self.a + self.b);
}
</script>
在我体内使用
<button onclick="initer()"> Click here to test </button>
<div id="id_div1"></div>
问题是当从initer()函数调用AnotherParentFn.prototype.caller时,temp变量仍未定义。代码有什么问题?
我的任务是在全局变量中分配函数ParentFn.prototype.Adding,并从AnotherParentFn.prototype.caller函数调用全局变量。怎么实现呢?
答案 0 :(得分:1)
您无需将其另存为全局变量。它已保存在ParentFn.prototype
中。您需要做的只是使用.call
调用它并传入您想要的接收器。您可以像这样实施AnotherParentFn.prototype.caller
:
AnotherParentFn.prototype.caller = function()
{
ParentFn.prototype.Adding.call(this);
}
这样你就可以完全摆脱temp
。您也无需在任何地方将this
分配给本地var self
。
答案 1 :(得分:0)
通过编写temp = obj.Adding();
,它存储了返回值。不是temp
中的函数指针。使用此
function initer()
{
temp = obj.Adding;
obj2.caller();
}
答案 2 :(得分:0)
括号用于执行函数。
将值分配给temp
时,您正在调用该函数并将结果(undefined
)分配给temp
。要在temp
中存储对函数的引用,请省略括号。
temp = obj.Adding;
答案 3 :(得分:0)
首先,obj.Adding
的引用未正确分配;它应该是这个(没有括号):
function initer()
{
temp = obj.Adding;
obj2.caller();
}
然后,在AnotherParentFn.prototype.caller
内部,您必须使用.call()
在调用期间显式地将当前对象作为this
传递:
AnotherParentFn.prototype.caller = function()
{
temp.call(this);
}