因此,我将遍历一些保存的旧代码片段,并对它们进行死记硬背的“学习”技术等。无论如何,我遇到了一些我不记得它如何工作的代码,所以我想复习一下。
我有两个对象,我想做一个混合(我知道还有其他方法,我想起来了,但是下面的这个是我需要更多解释的一种方法。)
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的这个上下文已分配给它。
答案 0 :(得分:1)
MAN
是一个变异(更改其属性)其调用上下文(其中的this
值)的函数:
var MAN = function() {
this.name = "MAN."
this.run = function() {
console.log("I AM RUNNING", this.name, this.age)
}
...
它将属性name
,run
和walk
放在函数内部的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)
}
...
想象一下this
内MAN
的每个实例都被Billy.prototype
取代了。
因此,Billy
现在在其原型上具有功能,并且在创建Billy
的实例时
var d = new Billy()
它将可以访问原型上的属性和功能,例如.run()
。