Javascript:构造函数、this和作用域
假设我有一个构造函数Alpha:Javascript:构造函数、this和作用域,javascript,oop,this,Javascript,Oop,This,假设我有一个构造函数Alpha: //[#1] Alpha = function(a,b){ attrib1 = a; attrib2 = b; }; 对于每个不同的实例,attrib1和attrib2应该具有不同的值 通常的解决方案是使用this.attrib1和this.attrib2切换attrib1和attrib2,但是由于我们在构造函数中,还没有对象,调用它没有什么意义(我知道大多数浏览器可能会接受它,但这不是重点) 第一个问题:attrib1和attrib2(如示例所示)是否是构造
//[#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。谢谢阅读。我想你应该做以下几点:
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
关键字的函数调用充当构造函数。在函数中,此
将引用新创建的对象
回答第一个问题:不,attrib1和attrib2不是构造函数的本地属性。它们是全局变量。为了使变量成为函数的局部变量,请始终使用
var
关键字(var attrib1=a;
)。我认为您需要执行以下操作:
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
关键字的函数调用充当构造函数。在函数中,此
将引用新创建的对象
回答第一个问题:不,attrib1和attrib2不是构造函数的本地属性。它们是全局变量。为了使变量成为函数的局部变量,请始终使用
var
关键字(var attrib1=a;
)。我知道如何创建新对象,这不是问题所在。我的问题是因为在C++语言中,引用构造函数中的这个指针被大多数编译器接受,但非法和不安全,所以我问JS中是否相同,如果是,如果有其他选择的话。我知道你的例子是有效的,但是作为一个C++程序员,我只是有点不愿意在构造函数中使用这个。不过还是要感谢你的回答。在JS的原型对象模型中,这是一种声明对象属性(实例变量)的简单方法。我理解C++程序员的感受,但这是JS中的一种常见模式(你会看到JS与传统的经典语言如C++或java)不同。Javascript确实是一种混乱的语言,它今晚会让我做噩梦。谢谢你的回答。我知道如何创建一个新对象,这不是问题所在。我的问题是因为在C++语言中,引用构造函数中的这个指针被大多数编译器接受,但非法和不安全,所以我问JS中是否相同,如果是,如果有其他选择的话。我知道你的例子是有效的,但是作为一个C++程序员,我只是有点不愿意在构造函数中使用这个。不过还是要感谢你的回答。在JS的原型对象模型中,这是一种声明对象属性(实例变量)的简单方法。我理解C++程序员的感受,但这是JS中的一种常见模式(你会看到JS与传统的经典语言如C++或java)不同。Javascript确实是一种混乱的语言,它今晚会让我做噩梦。谢谢你的回答。