“ this”关键字如何以特定方式起作用?

时间:2019-04-27 09:08:18

标签: javascript function methods constructor overwrite

我正在尝试学习JavaScript,但是遇到了一个问题(更多是对“ this”关键字的误解),使我无法继续前进。

我看了很多关于它的内容,几乎看不懂,但是仍然有一些麻烦。

我有一些代码:

function Person (name, age) {
  this.name = name;
  this.age = age;
  this.changeName = function (name) {
    this.name = name;
  }
}

我们在此使用“ this”做什么? 据我了解,我们使用“ this”在函数构造函数中创建变量,并为其提供我们可以引用的“ name”参数的值。我说的对吗?

然后我有以下代码:

var p1 = new Person ("John", 30);
p1.changeName ("Jane");
console.log(p1.name);

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

整个代码来自教学应用!

3 个答案:

答案 0 :(得分:0)

  

那么如果正确,为什么我们要使用它?更改实际的“名称”参数没关系吗?

否,在此示例中无需这样做。 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属性;相反,它只是通过getNamegetAge来访问它们的值。还有一个更改namechangeName)的功能;但没有更改age的功能。人们编写这样的代码,使得age不能从Person构造函数中创建的外部代码更改。

答案 1 :(得分:-1)

我想您可能会误解您实际上更改了哪个参数,因此我将其重写为这样,这对您有所帮助。

ts

答案 2 :(得分:-2)

关键字用于创建值并将其分配给类中的变量。它再次用于创建函数,即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;