用函数名或对象名 可以达到相同的效果如 上例中
return this.FirstName + " " + this.LastName 可以用
return person.FirstName + " " + this.LastName来代替 但是随着代码的增加,函数嵌套、各级调用等变得越来越复杂,那么传递一个对象的引用将变得越来越不明智,它会把你的代码弄得非常乱,甚至你自己都无法理解清楚。而this机制提供了一个更加优雅而灵便的方案
比如 你需要把 person 改成 student 如果你用 person 代替了this 那么你需要把所有的person 都改成student , 用this 的话 就只改第一个就可以了.
window和this的关系:全局作用域下的this就等于window
在全局对象上定义的变量可以直接访问
浏览器环境下获取全局对象的方式:window,self,frames,this
node中的全局对象是global,但是this并不指向gloabl
定义的全局变量并不会绑定到全局对象gloabl身上,但是可以往global身上添加属性
上面程序中 console.log(global) 语句输出的gloabl对象为:
在以前,从不同的 JavaScript 环境中获取全局对象需要不同的语句。在 Web 中,可以通过 window、self 或者 frames 取到全局对象,但是在 Web Workers 中,只有 self 可以。在 Node.js 中,它们都无法获取,必须使用 global。
在松散模式下,可以在函数中返回 this 来获取全局对象,但是在严格模式和模块环境下,this 会返回 undefined。
globalThis 提供了一个标准的方式来获取不同环境下的全局 this 对象(也就是全局对象自身)。不像 window 或者 self 这些属性,它确保可以在有无窗口的各种环境下正常工作。所以,你可以安心的使用 globalThis ,不必担心它的运行环境。为便于记忆,你只需要记住,全局作用域中的 this 就是 globalThis 。
先上一句别人总结的js中,构造函数、原型对象、对象实例之间关系的描述:
“每个构造函数都拥有一个原型对象,原型对象都包含一个指向构造函数的指针(constructor),实例都包含一个指向原型对象的内部指针(__proto__)”。
要理解你的例子,重要的是要理解“实例都包含一个指向原型对象的内部指针(__proto__)”这一句。还有一段关于原型链的总结,是这么说的:
每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去__proto__所指向的对象里找这个属性,这个__proto__指向的对象又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。
不用急,慢慢读,慢慢理解。理解之后,我们再回过头来看你的例子,你的疑问是instance是SubType的实例,而SubType并没有getSuperValue这个方法。我们前面说过,实例内部如果没有某个属性的话,会沿着原型链去寻找。根据“实例都包含一个指向原型对象的内部指针(__proto__)”这句话,得到instance.__proto__=SubType.prototype,而在SubType.prototype上还是找不到想要的属性,继续沿着原型链往上找。这时候看到“SubType.prototype=new SuperType()”,即SubType.prototype是SuperType的实例,于是我们推到出SubType.prototype.__proto__=SuperType.prototype,也就是instance.__proto__.__proto__=SuperType.prototype,而这时候在SuperType.prototype对象上找到想要的属性方法,于是就执行了,不再沿着原型链继续找了。