为什么 this 没有指向我所声明的对象?

  “为什么 this 没指向我所声明的这个对象,JavaScript 的 this 难道不是指向一个对象吗?”

  this 确实是一直指向一个对象的,而具体指向哪个对象是要看它所在的执行环境,而非它被声明时的环境。

  一般情况下,this 的指向可以分为四种类型:

  1. 作为对象的方法调用
  2. 作为普通函数调用
  3. 构造器调用
  4. func.prototype.call && func.prototype.apply

 

一、作为对象的方法调用:

  当作为调用者(对象)的方法被调用时,则 this 指向这个调用者。

举个例子:

const student = { name: 'A', greet: function () { alert(`hello,I am ${this.name}`) } }
student.greet()  // hello, I am A

 

二、作为普通函数调用:

  普通函数的 this 总是指向全局对象,而在浏览器中的 JavaScript,其全局对象就是 window 对象。

举个例子:

window.name = 'B' const getName = function () { console.log(this.name) } getName() // B

 

三、构造器调用:

  在 JavaScript 是没有类的,只不过我们可以使用构造器创建对象,并且在 new 运算符的作用下,使得构造器看起来更像是一个类。 构造器跟前面提及的普通函数从外观上来看相同,但是,两者的调用方式截然不同,在使用 new 运算符调用函数时,该函数返回一个对象,那么在构造器中的 this 指向就是返回的这个对象。

举个例子:

const Person = function () { this.name = 'C' } const student = new Person() console.log(student.name) // C

 

  有时候,事实并不是我们想象的那么美好,假如构造器显式地返回一个 obj 类型的对象,那么,我们上面所期待的结果将变成这个被返回来的 obj 对象。

举个例子:

const Person = function () { this.name = 'C' return { name: 'D' } } const student = new Person() console.log(student.name) // D

 

  有  obj 类型的对象,也有可能返回的是一个非对象类型的数据,如字符串,那么,这种情况下,不会影响 this 的正常指向。

 

posted @ 2022-02-27 14:05  Jason7322  阅读(46)  评论(1)    收藏  举报