【问题标题】:Why Should I use `this.name` instead of `name` in Person Constructor (and similar constructors)?为什么我应该在 Person Constructor(和类似的构造函数)中使用 `this.name` 而不是 `name`?
【发布时间】:2016-12-16 03:48:43
【问题描述】:

简单的问题。我为什么要这样做……

var Person = function(name) {
    this.name = name;
    this.sayHello = function(){
        console.log('Hello, my name is ' + this.name); // <-- 
    }
};

而不是...

var Person = function(name) {
    this.name = name;
    this.sayHello = function(){
        console.log('Hello, my name is ' + name); // <--
    }
};

我没有发现他们行为不同的情况。

【问题讨论】:

  • 您不必这样做。在此示例/上下文中也是如此。为什么你认为你必须这样做?
  • var fred = new Person("Fred"); fred.name = "Frederick"; fred.sayHello()。查看Person 对象的两个版本的作用。
  • 好吧,在您的情况下,这并不重要,因为无论如何您都事先更新了类属性。但是我认为使用 this.name (如在类属性中)而不是变量会更好,因为该对象应该打招呼并声明其名称(如在对象名称中)。这也是在该类上定义的方法,因此它应该使用自己的属性。
  • 这不是“最佳实践”——这两种用法是不同的。您可能想要传递一些东西并通过不公开它来保持它“不可变”,或者您可以传递一个值并期望它改变。但是,就像在你的第二个例子中一样,两者兼而有之,大多是荒谬的。如果您的对象中有一个字段,那么该字段应该很重要的期望。此外,您正在接受或回避this 的整个概念。这两种方法都有优点和缺点,并且取决于用例。碰巧你的实现有缺陷,没有省略this
  • 不,我指的是 second 示例。这是第二个示例的完整实现。您传入值name,将其分配给名为name 的对象字段,但随后您使用该字段。那既不是这里也不是那里。示例 1 是一致的,因此为什么 fred.name = "Frederick" 会更改名称,而下一次调用 sayHello() 会打印出新名称。使用示例 2 的实现 fred.name = "Frank" 实际上不会更改报告的名称 - @Ayan 显示的内容。因此,简而言之,对于示例二,更改 name 不会更改名称。正如我所说 - 有缺陷。

标签: javascript oop constructor


【解决方案1】:

因此,如果有任何功能重置名称,如果您不使用this.name,事情将不会得到反映。检查这个例子

var Person = function(name) {
  this.name = name;
  this.sayHello = function() {
    console.log('Hello, my name is ' + name);
    console.log('Hello, my name is ' + this.name);// <--
  }
};
Person.prototype.resetName = function(name) {
  this.name = name;
}

var me = new Person('A');
me.sayHello();
console.log('******');
me.resetName('Ayan');
me.sayHello();

【讨论】:

    【解决方案2】:
    • this.name 指的是“this”所代表的当前对象的属性“name”
    • name是函数的参数。

    正如其他人已经表明的那样,this.name 的值可以通过您声明的函数之外的其他指令通过更改对象的属性来更改,而使用 name 意味着您正在关闭参数(如果字符串不能在声明的函数之外进行操作,除非可能是异常情况)

    其次,您分配 this.name = name,但即使该操作也可能“失败”(不做可能的预期,如“更改 this.name 返回的值”)。例如。当您将此设置调用函数时,该对象具有“名称”属性的设置器,这不是微不足道的。即使没有任何额外声明的函数也可能发生这种情况:

    var Person = function(name) {
        this.name = name;
        console.log('Hello, my name is ' + this.name);
    };
    
    let obj = { set name(val) { }, get name() { return "unintended"; } };
    Person.call(obj, "intended");

    【讨论】:

      【解决方案3】:

      你使用哪个没关系.. this.name 只是将name 变量分配给你的“类人”,这样你就可以在你类中的其他函数中使用该变量。

      【讨论】:

      • 第二个sayHello 关闭了初始name,第一个没有。没有?
      • 呃,使用哪一个确实很重要。不过,效果是否与 OP 相关是另一回事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 2010-10-20
      相关资源
      最近更新 更多