所以,在Javascript教程的Objects部分中使用Code Academy I,我很难将我的大脑包裹在函数&对象。我想要一些帮助,并解释下面的部分代码。我已经在每一行上评论了我需要帮助的内容。非常感谢提前。
// Obviously declaring the Rabbit function with adjective to be called
function Rabbit(adjective) {
// I don't understand this line, or the context of why this is being used.
this.adjective = adjective;
// Why declare another function here? Is a function within a function
// considered a Method or is that only Function within an Object?
this.describeMyself = function() {
// I get this part but why does it need a function to do this?
console.log("I am a " + this.adjective + " rabbit");
};
}
// I don't get this either, Isn't this declaring a new object? How can
// that be when you only have a Function named Rabbit?
var rabbit1 = new Rabbit("fluffy");
var rabbit2 = new Rabbit("happy");
var rabbit3 = new Rabbit("sleepy");
// How could this work if describeMyself is in the Rabbit function and
// has nothing to do with rabit1?
console.log(rabbit1.describeMyself);
console.log(rabbit2.describeMyself);
console.log(rabbit3.describeMyself);
希望不要太困惑,但如果你们中任何一个人更有经验,Javascript的人们可以在评论中解释我所说的一切,我非常感激。感谢
答案 0 :(得分:1)
Rabbit
是构造函数,在使用new
关键字调用时会生成实例。this
指向您创建的实例。因此,通过var rabbit1 = new Rabbit('fluffy')
,您创建了一个看起来像这样的对象并分配给变量rabbit1
:
{
adjective: 'fluffy',
describeMyself: function() {...}
}
由于this
中的rabbit1.describeMyself
指向实例本身(rabbit1
),当您致电rabbit1.describeMyself()
时,this.adjective
实际上会为您提供rabbit1.adjective
。这就是你得到'fluffy'
的原因。
对于rabbit2
和rabbit3
,this
分别指向自己。
答案 1 :(得分:0)
我认为帮助我理解JavaScript的关键之处在于认识到JavaScript函数 是 对象。
JavaScript对象可以包含一个函数作为数组的值之一或作为更深层对象的值。
因此,在关于this.adjective
的问题中,您将传入的(从外部)adjective
存储在function Rabbit
的范围内,该范围变为Rabbit.adjective到更大的外部范围。如果你没有将它设置为Rabbit
的属性,那么Rabbit.adjective在较大的外部范围闭包中将是undefined
,但可用于Rabbit
内的任何内容。
的console.log(rabbit1.describeMyself); //这怎么可能呢? describeMyself在Rabbit函数中并没有任何关系 rabit1?
在这种情况下,rabbit1
通过首先从原型实例化(创建)继承了Rabbit
的属性(有点像父母一样,你可以随时复制,但不能复制)返回 - 所以通过值)使它具有与Rabbit
相同的所有属性,但是来自new
行的数据注入不同。通过这种方式,您可以使用Rabbit
rabbit1
内Rabbit
内的内容而不会污染Rabbit
,并且可以通过拥有Rabbit
的实例来自定义C#
你想要的(Rabbit1,Rabbit2等)。
如果您问为什么要这样做,答案就在于代码模块化和可重用性。随着项目代码库越来越大,越来越复杂,越来越多的开发人员开始研究这些代码库,您将希望创建可以被项目所有人遵循和重用的标准。