Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:构造函数、this和作用域_Javascript_Oop_This - Fatal编程技术网

Javascript:构造函数、this和作用域

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(如示例所示)是否是构造

假设我有一个构造函数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。谢谢阅读。

我想你应该做以下几点:

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确实是一种混乱的语言,它今晚会让我做噩梦。谢谢你的回答。