我正在尝试学习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
和getAge
访问它们的值。还有一个改变name
(changeName
)的功能;但是没有改变age
的功能。人们编写这样的代码,以便age
不能从Person
构造函数中创建的外部代码更改。
我想你可能会误解你实际改变了哪个参数,所以我这样重写它,holp这会有所帮助。
function Person (argument_name, argument_age) {
this.name = argument_name;
this.age = argument_age;
this.changeName = function (argument_change_name) {
this.name = argument_change_name;
}
}
let p1 = new Person ("John", 30);
p1.changeName ("Jane");
console.log(p1);
this关键字用于为类中的变量创建和赋值。它再次用于创建函数,getter或setter。因此,在您的代码中,this.changeName是一个函数,当传递一个值时将更改该人的名称。例如。
var a = 5; // a is an integer
var b = "Han"; //b is a string
var c = function(name){
//code here
} // then c is also a function;