我在javascript中研究功能继承。 根据我读过的文章,我写了代码:
function Base(){
var enableVar = true
this.enable = function(){
console.log("enable");
enableVar = true;
}
this.disable = function(){
console.log("disable");
enableVar = true;
}
}
function Child(){
Base.call(this);
}
new Child().enable();
此代码正常运行,我在控制台中看到了消息。
但我不明白行:
Base.call(this);
对我而言,Base
函数调用this
替换为this
,因此与Base();
相同
但看起来我的状态是错的。我看到错误:
VM898:62Uncaught TypeError: (intermediate value).enable is not a function(…)
请为我澄清差异。
function funcB(){
return this.a;
}
function funcA(){
this.a = 2;
return funcB();
}
alert(funcA());
此代码提醒2虽然我调用了像funcB
funcB();
我真的不明白差异
答案 0 :(得分:2)
functionName.call(obj)
通常会调用functionName
,但主要区别在于:functionName
内,this
指的是obj
。通常this
引用window
,但使this
引用obj
非常适合继承,因为您可以继续在所有构造函数中使用this
。
这是你的代码:
function funcB(){
return this.a;
}
function funcA(){
this.a = 2;
return funcB();
}
alert(funcA());
我们将逐步完成此操作。实际运行的第一件事是alert(funcA());
,它会调用funcA()
。该代码默认情况下this
等于window
(窗口是javascript&#39的全局变量容器)。那么计算机看到的下一步(执行funcA
)是:
function funcA(){
window.a = 2;
return funcB();
}
该代码将全局变量a
设置为2
,并返回funcB
返回的内容,因此我们将查看funcB
。请记住,默认情况下,javascript设置this = window
,因此funcB
实际上是
function funcB(){
return window.a;
}
请注意,我们将window.a = 2
设置回funcA
,因此funcB
成为
function funcB(){
return 2;
}
这意味着funcA
变为
function funcA(){
window.a = 2;
return 2;
}
这表示alert(funcA());
变为alert(2);
答案 1 :(得分:1)
首先,考虑一下new
的作用。它创建一个新对象,它是您指定的函数的实例。因此,new Child
会根据Child
Base.call(this)
表示“运行Base
函数,就好像新创建的Child
对象作为上下文”(其中“context”表示“this
的内部值”)。这意味着enable
和disable
函数会添加到新的Child
对象中。
现在想想调用Base()
的是什么。没有新的Base
对象。因此,函数中没有this
的值。新的Child
对象未被修改,因此当您调用.enable()
时,该函数尚不存在,并且您收到了您提到的错误。