2

这是一些示例代码

当我在 f2() 中调用 f1() 时,它会死掉。我不明白为什么。我也尝试替换thisTest.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);
4

3 回答 3

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 这样的环境中,它被称为别的东西,并且有一组不同的对象和函数。现在不用担心,我们会坚持使用浏览器。

希望这可以帮助。

于 2013-03-03T02:36:41.030 回答
1

你需要打电话this.f1()f1()

f1未定义为全局函数,它定义为对象的属性,因此您需要通过对象引用它。

更多关于课程

至于类的整体工作方式,JS 使用原型继承。如果将任何函数放在 new 运算符之后,则可以将其用作构造函数。使用 new 运算符会导致this绑定到新创建的对象。因此,构造函数中对 this 的任何引用都将绑定到新创建的对象。

因此,您的t1对象将所有附加到自身的函数作为新对象的方法。

t1.b不会返回任何东西,因为 b 没有附加到对象上。它仅在构造函数中定义为局部变量,从未绑定到对象

于 2013-03-03T02:15:46.500 回答
1

将第 13 行更改为this.f1();它可以完美运行!

于 2013-03-03T02:16:13.463 回答