Javascript帮助:函数/对象

时间:2016-08-28 01:17:00

标签: javascript function object javascript-objects

所以,在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的人们可以在评论中解释我所说的一切,我非常感激。感谢

2 个答案:

答案 0 :(得分:1)

  1. Rabbit构造函数,在使用new关键字调用时会生成实例
  2. 当您这样做时, this指向您创建的实例
  3. 因此,通过var rabbit1 = new Rabbit('fluffy'),您创建了一个看起来像这样的对象并分配给变量rabbit1

    {
      adjective: 'fluffy',
      describeMyself: function() {...}
    }
    

    由于this中的rabbit1.describeMyself指向实例本身(rabbit1),当您致电rabbit1.describeMyself()时,this.adjective实际上会为您提供rabbit1.adjective 。这就是你得到'fluffy'的原因。

    对于rabbit2rabbit3this分别指向自己。

答案 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 rabbit1Rabbit内的内容而不会污染Rabbit,并且可以通过拥有Rabbit的实例来自定义C#你想要的(Rabbit1,Rabbit2等)。

如果您问为什么要这样做,答案就在于代码模块化和可重用性。随着项目代码库越来越大,越来越复杂,越来越多的开发人员开始研究这些代码库,您将希望创建可以被项目所有人遵循和重用的标准。