javascript - “this”关键字如何以特定方式工作?
问题描述
我正在尝试学习 JavaScript,但遇到了一个问题(更多的是误解了“this”关键字),这让我无法继续前进。
我看了很多关于它的内容,几乎没有理解,但还是有一些麻烦。
我有一些代码:
function Person (name, age) {
this.name = name;
this.age = age;
this.changeName = function (name) {
this.name = name;
}
}
我们在这里用“这个”做什么?据我了解,我们使用“this”在函数构造函数中创建变量,并为其提供我们可以引用的“name”参数的值。我对吗?
然后我有这个代码:
var p1 = new Person ("John", 30);
p1.changeName ("Jane");
console.log(p1.name);
正如我在这里整理的那样,我们调用方法来覆盖我们创建的要引用的变量。但它不会改变实际参数。那么,如果它是正确的,我们为什么要使用它?更改实际的“名称”参数是否重要?
整个代码来自教学应用!
解决方案
那么,如果它是正确的,我们为什么要使用它?更改实际的“名称”参数是否重要?
不,在这个例子中没有必要这样做。changeName
更改由创建的对象的属性new Person
。
确实,该示例代码有点奇怪,因为它changeName
在构造函数中创建了函数,但并没有做你在构造函数中创建函数时通常会做的事情。我希望代码是这样的,它将changeName
原型放在原型上:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.changeName = function(name) {
this.name = name;
};
(或class
等价物)或这个:
function Person(name, age) {
this.getName = function() {
return name;
};
this.changeName = function(newName) {
name = newName;
};
this.getAge = function() {
return age;
};
}
该代码确实更新了参数(这对代码调用完全没有影响Person
)。它根本不创建name
和age
属性;相反,它只是使它们的值可以通过getName
and访问getAge
。还有一个函数可以改变name
( changeName
); 但是没有功能可以改变age
。人们编写这样的代码,因此age
无法从Person
构造函数中创建的外部代码更改。