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

问题描述 投票:-2回答:3

我正在尝试学习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);

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

整个代码来自教学应用程序!

javascript function methods constructor overwrite
3个回答
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
投票

我想你可能会误解你实际改变了哪个参数,所以我这样重写它,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);

-2
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.