首页 > 解决方案 > “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);

正如我在这里整理的那样,我们调用方法来覆盖我们创建的要引用的变量。但它不会改变实际参数。那么,如果它是正确的,我们为什么要使用它?更改实际的“名称”参数是否重要?

整个代码来自教学应用!

标签: javascriptfunctionmethodsconstructoroverwrite

解决方案


那么,如果它是正确的,我们为什么要使用它?更改实际的“名称”参数是否重要?

不,在这个例子中没有必要这样做。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)。它根本不创建nameage属性;相反,它只是使它们的值可以通过getNameand访问getAge。还有一个函数可以改变name( changeName); 但是没有功能可以改变age。人们编写这样的代码,因此age无法从Person构造函数中创建的外部代码更改。


推荐阅读