gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:23:44 26 4
gpt4 key购买 nike

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

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

对于每个不同的实例,attrib1 和 attrib2 应该具有不同的值。

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

第一个问题:attrib1 和 attrib2(如示例所示)对于构造函数来说是本地的吗?我对 Javascript 及其原型(prototype)系统还很陌生。

我的解决方案是:

//[#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 的成员才会这样做,因为它是被复制的原型(prototype)?

我通常是一名 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 关键字开头的函数调用充当构造函数。在函数内 this 将引用新创建的对象。

<小时/>

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

关于Javascript:构造函数、this 和作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5563530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com