【问题标题】:JavaScript Making independent functions work without defining newJavaScript 使独立函数工作而不定义新函数
【发布时间】:2014-05-26 16:53:04
【问题描述】:

我有这样的代码:

function Food(type) {
  this.type = type;
  this.timesEaten = 0;
}

Food.prototype.eat = function() { // Dependent function
  this.timesEaten++;
}

Food.prototype.pasta = function() { // In-dependent function
  return new Food("pasta")
}

所以,我希望能够在不定义新食物的情况下使用意大利面功能,如下所示:

var pasta = Food.pasta()

但是,这行不通,你必须这样做:

var pasta = new Food().pasta()

如果你像这样设置食物,“Food.pasta()”确实有效:

var Food = {
  pasta: function() {
    return {type: pasta};
  }
}

但是 new Food 不起作用,这意味着我必须使用“return {type: Pasta}”。

我想知道,有没有什么方法可以创造一种既可以依赖又可以独立的食物?

【问题讨论】:

标签: javascript function object


【解决方案1】:

像您的.pasta() 方法这样不对任何实例数据进行操作的方法称为静态方法。您不希望它出现在原型上,因为原型只会出现在实例化对象的查找链中(通过 new Food() 创建实际的 Food 对象之后)。

相反,对于静态方法,您可以将其放在构造函数本身上,如下所示:

Food.pasta = function() {
    return new Food("pasta");
}

那个,你可以这样称呼它:

var pasta = Food.pasta();

记住,在 javascript 中,函数也是对象很有用,因此它们可以具有属性/方法,并且当您正在寻找放置不属于特定实例化对象或需要的静态函数或数据的地方时在特定的实例化对象上调用时,Constructor 对象通常是放置它们的好地方。

【讨论】:

  • bbuecherl 已经发布了相同的答案,为什么还要发布这个?
  • @Murplyx 他们的答案间隔 50 秒发布。我想当 bbuecherl 提交他/她的答案时,jfriend 已经很好地解决了问题。此外,jfriend 的回答比 bbuecherl 的回答包含更多的解释。
  • 令人惊讶的是,他们都在我发布我的帖子后不到 6 分钟就发布了。
  • @Murplyx - 当我写下我的答案时,没有显示答案。
  • @Murplyx - 我的答案是否不包含其他答案中未涵盖的一些解释? StackOverflow 不是先到先得、赢者通吃的系统。我写了一个原始答案(没有复制任何人),由读者决定投票给哪个答案,你接受哪个答案。事实上,bbuecherl 写的一些内容甚至是不正确的。 Food 是一个函数对象。我不确定为什么 bbuecherl 将其称为“命名空间对象”。
【解决方案2】:
function Food(type) {
  this.type = type;
  this.timesEaten = 0;
}

Food.prototype.eat = function() { // Dependent function
  this.timesEaten++;
}

Food.pasta = function() { // In-dependent function
  return new Food("pasta")
}

Food.prototype 函数仅适用于 Food 的对象,而对于 Food.pastaFood 只是一个命名空间对象。

用法:

Food.pasta();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 2018-06-05
    • 2016-08-17
    • 1970-01-01
    • 2018-05-08
    • 2022-01-13
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多