以下是一些sample code。
当我在f2()内部调用f1()时它会死掉。我不明白为什么。我还尝试用this
替换Test.prototype
,但它的失败方式也一样。在谈到阅读之后我问我是否var foo = new bar()
并且在foo上调用函数this
总是foo变量。他的回答使我感到困惑。
类/这如何在JS中工作?我只想要基础知识。虽然静态变量和函数可能很容易解释,但我不需要虚函数,继承等。我不需要知道公共/私人是如何工作的,但只要我能弄清楚如何访问公共变量和函数我现在就可以了。
var msg='';
try{
function Test(){
var a='';
var b=3;
var c=4;
this.f1=function(){
msg+="f1\n";
}
this.f2=function(){
msg+="f2a\n";
f1();
msg+="f2b\n";
}
this.f3=function(){
msg+=b+"\n";
b=5;
}
function f4(){
c++;
}
}
var t1 = new Test();
t1.f2();
t1.f3();
t1.f4();
console.log(t1.b);
}
catch(err)
{
console.log(err);
}
console.log(msg);
答案 0 :(得分:4)
其他答案都是正确的:
this.f2=function(){
msg+="f2a\n";
f1();
msg+="f2b\n";
}
为:
this.f2=function(){
msg+="f2a\n";
this.f1();
msg+="f2b\n";
}
为什么:
我可以从您的术语中看出,您来自不同的语言背景,如Java或其他什么。
让我们首先得到一些简单的东西。
javascript中没有类(嗯,即将推出的版本,但我们现在不需要谈论它)。在javascript中,我们反对和原型链。
“this”由包含该对象的对象定义。
几乎所有东西都是一个物体。几乎所有东西都继承自原始的Object()。
console.log( ({}).constructor.prototype ) // Object {}
函数具有原型,对象具有具有原型的构造函数。我知道,起初这看起来很混乱。
console.log( ({}).prototype ) // undefined
console.log( function(){}.prototype ) // Object {}
console.log( (new Function()).prototype ) // Object {}
因此,对于一个非常基本的例子,比较这两个。
//eg1
var fn = function(){
console.log( this ); // window
}
//eg2
var x = {
fn: function(){
console.log( this ); // Object {fn: function}
}
};
x.fn();
在这里我们可以看到,在eg1中,fn()是在全局范围的上下文中定义的。 (见下面的附注)。在eg2中,我们可以看到“this”指的是包含对象“x”;
**旁注:在浏览器中,这始终是“窗口”。在像node.js这样的环境中,它调用了其他东西并且具有不同的对象和函数集。现在不用担心,我们会坚持浏览器。
希望这有帮助。
答案 1 :(得分:1)
您需要致电this.f1()
而不是f1()
f1
未定义为全局函数,它被定义为对象的属性,因此您需要通过对象引用它。
就类如何整体工作而言,JS使用原型继承。如果将它放在new运算符之后,任何函数都可以用作构造函数。使用new运算符会导致this
绑定到新创建的对象。因此,构造函数内对此的任何引用都将绑定到新创建的对象。
因此,您的t1
对象将所有函数作为新对象上的方法附加到自身。
t1.b
不会返回任何内容,因为b未附加到对象上。它只被定义为构造函数中的局部变量,它从未绑定到对象
答案 2 :(得分:1)
将第13行更改为this.f1();
,然后才能完美运作!