Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript帮助:函数/对象_Javascript_Function_Object_Javascript Objects - Fatal编程技术网

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

因此,使用代码学院,我在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 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()
    。按照惯例,构造函数函数是大写的,以区分它们。@ScottSauyet
    new
    任何函数如果不是为了构造函数的目的而组成的,就没有什么意义。但是,是的,你可以
    new
    it:)事实上,如果它对
    这个
    做了一些事情,那么它可能是有害的,而这个
    实际上是以不同的方式使用的。但是它已经做了。我知道,我看到了它……我已经清理了由此产生的混乱。:-)