'this' 关键字,不清楚

IT技术 javascript this prototype
2021-02-27 05:41:53

对以下代码中的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',原型方法通过 return this.name获取名称但是,任何人都可以向我解释,一号通和二速,他们代表的是什么做的?

6个回答

在 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的区别在于with call,您需要单独传递所有参数,而 with apply,您可以传递包含所有参数的数组。

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

这个链接让你明白:this关键字

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

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

Imo 是“所有者”一词具有误导性。例如,功能可不止一个属性一个对象。但是当然它不能同时引用两个对象。
2021-04-26 05:41:53

当您使用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:给你的额外问题(看看你是否真的理解它;)):thisin 指的是get()什么?var get = myFoo.get_name; var name = get();get_name是您在示例中定义的函数)。
2021-05-13 05:41:53

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

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

所以这个看起来相同的函数:

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

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

this指的是调用函数的对象,在本例中是myFoo当你构建myFoo一个new Foo('John')this关键字,可以设置myFoo.name = 'John',所以当你调用myFoo.get_name()它也会让你return myFoo.name这等于John

原型包含所有对象new Foo()共享的属性和方法因此,即使myFoo您可以get_name在该实例中使用同名函数进行覆盖,另一个对象myOtherFoo仍将保持get_name其原型形式。
2021-04-23 05:41:53
谢谢:),我有更多问题,我可以这样理解,prototype 是 myFoo 的父级(myFoo 是prototype 的子级)?
2021-04-25 05:41:53