【问题标题】:Javascript Help: Functions/ObjectsJavascript 帮助:函数/对象
【发布时间】:2017-01-04 08:38:33
【问题描述】:

所以,使用 Code Academy 时,我在 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 人员可以解释我在 cmets 中谈到的所有内容,我将不胜感激。谢谢

【问题讨论】:

  • 编程语言中的“方法”通常是作为对象的属性或子对象附加的函数(但定义 JavaScript 的 EMCAScript 规范从不使用“方法”一词来描述语言的任何特性; 这只是一个笼统的词)。对于其余部分,这通常由JavaScript: How does 'new' work internally 回答,尽管那里的答案可能已经假设您对语言有很强的掌握。简短的回答是 new 使用新创建的 this 对象调用函数。
  • 请注意,您的课程所教授的技术仍然有效,但最新版本的 Javascript 通常为considered superseded。但是,如果您有任何现代 OOP 语言(C++、Ruby、Java)的经验,应该很容易找到与它们的类、方法等概念的相似之处。但请注意,底层机制(原型委托)有很大不同.
  • 纠正我之前的评论:规范实际上确实将“方法”明确定义为“作为属性值的函数”。 (我误以为它没有为该类函数提供这样的定义。)

标签: javascript function object javascript-objects


【解决方案1】:
  1. Rabbit 是一个构造函数,当使用new 关键字调用时会生成一个实例
  2. 当您这样做时,this 指向您创建的实例

所以,var rabbit1 = new Rabbit('fluffy'),您创建了一个看起来像这样的对象并分配给变量rabbit1

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

由于rabbit1.describeMyself 中的this 指向实例本身(rabbit1),当你调用rabbit1.describeMyself() 时,this.adjective 实际上给你rabbit1.adjective。这就是你得到'fluffy'的原因。

对于rabbit2rabbit3this 分别指向自己。

【讨论】:

  • 我建议你读一本入门级的书。交叉耦合的话题在学习编程语言中很常见,在线系列通常不能很好地处理这种情况。
  • 此外,any函数可以用作构造函数,只需var something = new myFunction()即可。按照惯例,构造函数被大写以区分它们。
  • @ScottSauyet new 任何函数都不会很有意义,如果它不是为了构造函数而组成的。但是,是的,无论如何你都可以new :)
  • 事实上,如果它对this 做了一些本来打算以不同方式使用的事情,它可能会产生积极的危害。但它已经完成了。我知道,我已经看到了……我已经清理了造成的混乱。 :-)
【解决方案2】:

我认为帮助我理解 JavaScript 的关键是认识到 JavaScript 函数对象。

JavaScript 对象可以包含一个函数作为数组的值之一或作为更深层次对象的值。

因此,在您关于this.adjective 的问题中,您将传入的(从外部)adjective 存储在function Rabbit 的范围内,这成为 Rabbit.adjective 到更大的外部范围。如果您没有将其设置为 Rabbit 的属性,那么 Rabbit.adjective 将在较大的外部范围闭包中为 undefined,但可用于 Rabbit 内的任何内容。

console.log(rabbit1.describeMyself); // 如果是这样的话,这怎么可能? describeMyself 在 Rabbit 函数中,与 兔子1?

在这种情况下,rabbit1 继承了Rabbit 的属性,方法是首先从原型实例化(创建)(有点像你总是可以从中复制但不能复制回的父级 - 所以通过value) 以便它具有与Rabbit 相同的所有属性,但从new 行注入不同的数据。通过这种方式,您可以在rabbit1 中使用Rabbit 中的内容而不会污染Rabbit,并且可以通过拥有任意数量的Rabbit(Rabbit1、Rabbit2 等)实例来自定义Rabbit

如果您问为什么要这样做,答案在于代码模块化和可重用性。随着项目代码库变得越来越大、越来越复杂,有越来越多的开发人员参与其中,您需要创建可以被从事项目的每个人遵循和重用的标准。

【讨论】:

  • 我相信我很理解代码中发生了什么,但这种解释让我感到困惑。对于初学者来说,函数恰好是对象这一事实与所有这些无关。如果他们不共享层次结构,那么一切都会一样。虽然,是的,有一些原型需要考虑(上面 Leo 的回答中缺少),但这并不能解释它们,我认为 OP 可能应该在跑步之前先走。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多