【问题标题】:'this' keyword, not clear'this'关键字,不清楚
【发布时间】:2011-07-22 17:34:37
【问题描述】:

我对以下代码中的“this”关键字感到困惑,有两个“this”:

var Foo = function(string){
  this.name=string // 1st-this
}

Foo.prototype.get_name = function(){
  return this.name // 2nd-this
}

var myFoo = new Foo('John')

the_name=myFoo.get_name()

'the_name' 等于'John',原型方法通过返回this.name获取名字。但是谁能给我解释一下 1st-this 和 2nd-this,它们代表什么?

【问题讨论】:

标签: javascript this prototype


【解决方案1】:

在 Javascript 中,this 的值取决于调用函数的方式

JS中有5种调用函数的方式,都对this有影响:

  1. new Foo(); this 将反映该新对象
  2. Foo(); this 将是全局对象(!)
  3. var obj = { foo: Foo };
    obj.foo();
    obj 的方法调用; this 将是 obj
  4. Foo.call(thisObject, arg1, arg2); this的值
  5. Foo.apply(thisObject, [args]); this的值

在 4 和 5 中,callapply 的区别在于 call 需要单独传递所有参数,而 apply 可以传递包含所有参数的数组。

请注意,在我上面的示例 2 中,函数应该被称为 foo 而不是 Foo。由于不可能立即知道函数是否应该使用new 调用,因此共识是如果函数名是构造函数,则以大写字母开头(并且应该与new 一起使用);否则,它应该以小写开头。

【讨论】:

    【解决方案2】:

    哇,所有这些不同的答案,其中只有一个甚至使用了“上下文”这个词!这是您问题的直接答案:

    this 关键字是指向上下文对象的对象引用。

    在您的示例中,this 指的是 Foo 对象的一个​​实例。

    【讨论】:

      【解决方案3】:

      答案是“视情况而定”,因为this 的含义取决于调用它的上下文

      例如在回调之类的事情中,this 不再指代当前对象,而是更典型地指代发生事件的 DOM 元素:

      所以这个外观相同的函数:

      Foo.prototype.handleSomeEvent = function(e) {
          return this.name;
      }
      

      如果用作事件回调将尝试解析元素的name 属性,而不是您的对象的名称。

      【讨论】:

        【解决方案4】:

        “this”关键字总是指函数的所有者。因此,例如,如果您单击访问该功能的按钮,则 this 指的是该按钮。因此,如果您的按钮 A 具有调用该函数的 onclick,那么这就是 A。

        在这种情况下,这将是 John,因为在这两种情况下,它们都引用 myFoo,即 John,因为在调用它们时使用了 Myfoo

        【讨论】:

          【解决方案5】:

          当您使用 new 关键字时,this 是您正在创建的实例对象。

          var foo = new Bar();
          

          Bar 的实例被分配给foo


          如果你不这样做,this 就是你调用的方法所在的对象。

          var baz = foo.thing();
          var boz = thing();
          

          foo 在第一个示例中,window 在第二个示例中(window 是默认对象)。


          您也可以使用 apply 来处理它

          var baz = foo.thing.apply(bar);
          

          这里this(还在thing方法里面)是bar

          【讨论】:

          • @Mellon:给你一个额外的问题(看看你是否真的理解它;)):thisget() 中指的是什么? var get = myFoo.get_name; var name = get();get_name 是您在示例中定义的函数)。
          【解决方案6】:

          在您的示例中,它们是相同的,当您从您在原型链中覆盖的方法调用 this 时,您指的是与从构造函数中调用 this 时相同的东西。

          使用回调或在原型方法中定义成员变量时会变得更加棘手。

          【讨论】:

          • 谢谢 :),我还有个问题,我可以这样理解,prototype 是 myFoo 的父级(myFoo 是原型的子级)吗?
          【解决方案7】:

          this 指的是调用函数的对象,在本例中为myFoo。当您将myFoo 构造为new Foo('John') 时,this 关键字使您能够设置myFoo.name = 'John',因此当您调用myFoo.get_name() 时,它也会让您return myFoo.name 等于John

          【讨论】:

          • 谢谢 :),我还有个问题,我可以这样理解,prototype 是 myFoo 的父级(myFoo 是原型的子级)吗?
          • 原型包含所有使用new Foo() 创建的对象共享的属性和方法。因此,即使在 myFoo 中,您可以在该实例中使用具有相同名称的函数覆盖 get_name,但另一个对象 myOtherFoo 将保持 get_name 的原型形式。
          【解决方案8】:

          这个链接让你明白:The this keyword

          function doSomething() {
             this.style.color = '#cc0000';
          }
          

          在 JavaScript 中,this 总是指我们正在执行的函数的“所有者”,或者更确切地说,指的是函数作为方法的对象。当我们在页面中定义忠实的函数 doSomething() 时,它的所有者就是页面,或者更确切地说,是 JavaScript 的窗口对象(或全局对象)。但是,onclick 属性归其所属的 HTML 元素所有。

          【讨论】:

          • 我认为“所有者”一词具有误导性。例如。函数可以是多个一个对象的属性。但当然它不能同时引用两个对象。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-10
          • 1970-01-01
          • 2019-11-18
          • 2018-05-07
          相关资源
          最近更新 更多