JS中的类和函数?

时间:2013-03-03 02:11:46

标签: javascript class

以下是一些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);

3 个答案:

答案 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();,然后才能完美运作!