原型和“此”上下文混乱

时间:2019-04-14 20:28:25

标签: javascript

因此,我将遍历一些保存的旧代码片段,并对它们进行死记硬背的“学习”技术等。无论如何,我遇到了一些我不记得它如何工作的代码,所以我想复习一下。

我有两个对象,我想做一个混合(我知道还有其他方法,我想起来了,但是下面的这个是我需要更多解释的一种方法。)

var MAN = function() {
   this.name = "MAN."
   this.run = function() {
      console.log("I AM RUNNING", this.name, this.age)
   }
   this.walk = function (){
      console.log("I AM WALKING")
   }
  return this
}

var Billy = function() {
  this.name = "BILLY"
  this.age = 998987
}

MAN.call(Billy.prototype)// <--- THIS is where I'm having issue
var d = new Billy()
console.log(d.run())

我了解“呼叫”正在将MAN的“ this”上下文设置为Billy。...但是,为什么我不这样做

var d = new MAN()...

我正在设置 MAN 的上下文,而不是 Billy 的上下文...我看到这里的“ Billy.prototype”是借来的,未修改。呼叫是如何做到的。.我发现MAN正在被迭代,并且Billy的这个上下文已分配给它。

1 个答案:

答案 0 :(得分:1)

MAN是一个变异(更改其属性)其调用上下文(其中的this值)的函数:

var MAN = function() {
   this.name = "MAN."
   this.run = function() {
      console.log("I AM RUNNING", this.name, this.age)
   }
   ...

它将属性namerunwalk放在函数内部的this上。

当您使用.call时,您以第一个参数.call 作为调用上下文来调用函数(被调用函数中的this值) 。所以

MAN.call(Billy.prototype)

解释器运行:

   Billy.prototype.name = "MAN."
   Billy.prototype.run = function() {
      console.log("I AM RUNNING", this.name, this.age)
   }
   ...

想象一下thisMAN的每个实例都被Billy.prototype取代了。

因此,Billy现在在其原型上具有功能,并且在创建Billy的实例时

var d = new Billy()

它将可以访问原型上的属性和功能,例如.run()