Javascript帮助:函数/对象
因此,使用代码学院,我在Javascript教程的对象部分,我的大脑很难围绕函数和对象进行思考。我想要一些帮助和解释下面的部分代码。我已经在每一行评论了我需要帮助的地方。非常感谢Javascript帮助:函数/对象,javascript,function,object,javascript-objects,Javascript,Function,Object,Javascript Objects,因此,使用代码学院,我在Javascript教程的对象部分,我的大脑很难围绕函数和对象进行思考。我想要一些帮助和解释下面的部分代码。我已经在每一行评论了我需要帮助的地方。非常感谢 // Obviously declaring the Rabbit function with adjective to be called function Rabbit(adjective) { // I don't understand this line, or the context of why
// 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人员能够解释我在评论中提到的一切,我将不胜感激。谢谢
Rabbit
是一个构造函数,当使用new
关键字调用时,它会生成一个实例此
指向您创建的实例var rabbit1=new Rabbit('fluffy')
,您创建了一个看起来像这样的对象,并将其分配给变量rabbit1
:
{
adjective: 'fluffy',
describeMyself: function() {...}
}
正如rabbit1.descripebeimy中的this
指向实例本身(rabbit1
),当您调用rabbit1.descripebeimy()
时,this.descriptor
实际上为您提供了rabbit1.descriptor
。这就是为什么你会感到毛茸茸的原因
对于rabbit2
和rabbit3
,这分别指向它们自己。我认为帮助我理解JavaScript的关键是认识到JavaScript函数是对象
JavaScript对象可以包含作为数组值之一的函数,也可以包含作为深层对象值的函数
因此,在您关于this.approx
的问题中,您将传入(从外部)的approx
存储在函数Rabbit
的范围内,该函数变为Rabbit.approx到更大的外部范围。如果未将其设置为Rabbit
属性,则在较大的外部作用域闭包中,Rabbit.approx将是undefined
,但可用于Rabbit
内部的任何内容
console.log(rabbit1.descripbeimf);//如果
描述我自己是在兔子的功能,并没有任何关系
兔子
在这种情况下,rabbit1
继承了Rabbit
的属性,首先是从原型中实例化(创建)的(有点像一个父对象,您总是可以从中复制,但不能复制回它——所以按值)因此,它具有与Rabbit
相同的所有属性,但从新行注入的数据不同。通过这种方式,您可以使用Rabbit
内部rabbit1
中的内容,而不会污染Rabbit
,并且可以通过拥有任意多个Rabbit
(rabbit1、Rabbit2等)的实例来定制Rabbit
如果您问为什么要这样做,答案在于代码模块化和可重用性。随着越来越多的开发人员使用项目代码库,项目代码库变得越来越大、越来越复杂,您将希望创建项目中每个人都可以遵循和重用的标准。编程语言中的“方法”通常是作为对象的属性或子对象附加的函数(但定义JavaScript的EMCAScript规范从未使用“方法”一词来描述语言的任何特性;它只是一个通用词)。对于其余部分,答案通常是,尽管那里的答案可能假设已经掌握了该语言的强大能力。简短的答案是new
使用新创建的this
对象调用函数。请注意,您的课程正在教授一种仍然有效的技术,但通常是最新版本但是如果你有任何现代OOP语言(C++、Ruby、Java)的经验,应该很容易找到与它们的类、方法等概念的相似之处。但是请注意,底层机制(原型委托)明显不同。纠正我之前的评论:规范实际上明确定义了“方法”是“作为属性值的函数”。(我错误地认为它没有为该类函数提供这样的定义。)我相信我很理解代码中发生的事情,但这一解释让我感到困惑。对于初学者来说,函数恰好是对象这一事实与所有这些都无关。如果它们没有共享层次结构,那么一切都将是一样的。尽管如此,是的,还有一些原型需要考虑(上面Leo的答案中没有提到),这并不能解释它们,我认为OP在运行之前应该先走一走。我建议你读一本入门级的书。交叉耦合主题在学习编程语言时非常常见,在线系列通常无法很好地处理此类情况。此外,任何函数都可以用作构造函数,只需通过var之类的方式即可=new myFunction()
。按照惯例,构造函数函数是大写的,以区分它们。@ScottSauyetnew
任何函数如果不是为了构造函数的目的而组成的,就没有什么意义。但是,是的,你可以new
it:)事实上,如果它对这个
做了一些事情,那么它可能是有害的,而这个实际上是以不同的方式使用的。但是它已经做了。我知道,我看到了它……我已经清理了由此产生的混乱。:-)