Javascript:构造函数,这和范围

时间:2011-04-06 08:34:07

标签: javascript oop this

假设我有一个构造函数Alpha:

//[#1]
Alpha = function(a,b){
attrib1 = a;
attrib2 = b;
};

attrib1和attrib2应该为每个不同的实例赋予不同的值。

通常的解决方案是使用this.attrib1和this.attrib2切换attrib1和attrib2,但是因为我们在构造函数内部还没有对象,并且调用它没有多大意义(我知道大多数浏览器可能会接受无论如何,但这不是重点。)

第一个问题:构造函数的本地是attrib1和attrib2(如示例所示)吗?我是Javascript及其原型系统的新手。

我的解决方案是:

//[#2]
Alpha = function(a,b){
attrib1 = a;
attrib2 = b;
};
Alpha.attrib1 = undefined;
Alpha.attrib2 = undefined;

但是,构造函数如何知道我指的是对象的属性,而不是一些名为attrib1和attrib2的局部变量,因为我在属性之前声明了构造函数?这个解决方案不会很糟糕,因为我应该将属性声明为Alpha.prototype.attrib1和Alpha.prototype.attrib2,因为它们对所有Alpha对象都是通用的,不需要多次声明吗? 我知道对象文字可能是一种解决方法,但我不想使用它们。如果我提到“类”变量,像这样:

//[#3]
Alpha = function(a,b){
Alpha.attrib1 = a;
Alpha.attrib2 = b;
}

会发生什么?通常,它会改变attrib1和attrib2的类值,但是因为在JS类中已经是对象并不等同于我的示例#1,不同之处在于Alpha的每个实例都将以attrib1和attrib2设置为以前的构造函数设置它们?或者也许只有声明为Alpha.prototype.attrib的成员会这样做,因为它是被复制的原型?

我通常是一名C ++程序员,如果这是一个愚蠢的问题,我很抱歉,但是在我用JS编写任何过于庞大的东西之前,我想了解更多。谢谢你的阅读。

1 个答案:

答案 0 :(得分:3)

我想你想要做以下事情:

Alpha = function(a, b) {
    this.a = a;
    this.b = b;
}

var alpha1 = new Alpha(1, 2);
var alpha2 = new Alpha(3, 4);

console.log('alpha1: '+alpha1.a+', '+alpha1.b); // prints alpha1: 1, 2
console.log('alpha2: '+alpha2.a+', '+alpha2.b); // prints alpha1: 3, 4

密钥是new关键字:以new关键字开头的函数调用充当构造函数。函数this内部将引用新创建的对象。


回答第一个问题:不,attrib1和attrib2不是构造函数的本地问题。它们是全局变量。为了使变量成为函数的局部变量,请始终使用var关键字(var attrib1 = a;)。