【问题标题】:How can I pass variables to a new object in javascript?如何将变量传递给javascript中的新对象?
【发布时间】:2016-01-04 14:09:38
【问题描述】:

我希望实现this lib:

var timer = new Tock({
      this.callback:  callbackFunction,
      this.interval:  10,
      this.complete:  completeFunction,
});

但是,我希望能够进行动态调用:

var milkshake = my_milkshakes[next];  
var timer = new Tock({
      this.callback:  makeMoreMilkshakes(),  // (Call version 2)
      this.interval:  shakeTime,
      this.complete:  bringThemToTheYard 
});

function bringThemToTheYard(){


    return setNextCallbackFunction();
}

这里的问题似乎是我无法超出初始化范围。在 Java 中,我可以轻松地将参数传递给构造函数,除非需要函数句柄。

抽象是指代码不能通过引用重用,但这是公认的松散术语。

我的目标是初始化单个 new 计时器调用以创建新计时器。我需要 5 个不同的计时器。理想情况下,一个定时器就足够了,因为定时器是按线性时间启动和停止的。

我的主要问题是我不能(例如)将this.interval 设置为动态变量x,因为我不知道如何将值传递给构造函数。


我的实现基于以下文档中的"code"

var timer = new Tock({
  countdown: true,
  interval: 10,
  callback: someCallbackFunction,
  complete: someCompleteFunction
});

【问题讨论】:

  • 1) Javascript 没有“抽象构造函数”的概念,不清楚你的意思。 2) this.callback 作为对象的键没有多大意义,那应该是什么? 3) 目前尚不清楚您要达到的目标。
  • ">我的目标是初始化使用单个新计时器调用来创建新计时器。"所以你需要一种工厂函数?
  • OOP 中的“Abstract”通常与“in place”有着非常非常不同的含义;你最好避免使用这个词以减少混淆。 { this.callback: .. } 仍然是语法错误。
  • 我只是重申@deceze所说的话,很难理解你的问题到底是什么。
  • 关于您的编辑:当您执行new Tock({...}) 时,您将一个值传递给构造函数,即包含各种属性的 object literal。但是您的对象文字格式错误,因为键只能是字符串文字,而不是this.something

标签: javascript constructor abstract


【解决方案1】:

我不太确定您是否掌握了 JavaScript,以及它与 Java 的真正区别有多大——它们并没有那么相似。

这个:

var timer = new Tock({
    this.callback:  makeMoreMilkshakes(),  // (Call version 2)
    this.interval:  shakeTime,
    this.complete:  bringThemToTheYard 
});

不适用于 JavaScript。这是一个语法错误,因为您不能在对象定义的左侧使用点表示法 (.)。看起来你可能想要这样的东西:

function Tock(config) {
    var defaultCallback = callbackFunction;
    var defaultInterval = 10;
    var defaultComplete = completeFunction;

    this.callback = config.callback || defaultCallback;
    this.interval = config.interval || defaultInterval;
    this.complete = config.complete || defaultComplete;

    /**
     * This could also be written as follows, I just wanted
     * to emphasize how many people write "defaults" in JS
    this.callback = config.callback || callbackFunction;
    this.interval = config.interval || 10;
    this.complete = config.complete || completeFunction;
    */

    // Go on doing stuff....
}

var timer = new Tock({
    callback: makeMoreMilkshakes(),
    interval: shakeTime,
    complete: bringThemToTheYard
});

另外,这条线看起来不正常:

    callback: makeMoreMilkshakes(),

这是将makeMoreMilkshakes结果 分配给回调,而不是函数本身。如果这是有意的,那么就不要介意这一点。但我认为你想要:

    callback: makeMoreMilkshakes,

没有()

【讨论】:

    【解决方案2】:

    我正在寻找的解决方案是这样的:

    function startNewTimer(type) {
      var timer = new Tock({});
    
      var options = null;
    
      switch (type){
        case "first":
          options.callback = function1;
          options.interval = interval1;
          options.complete = startNewTimer(second);
          break;
        case "second":
          options.callback = function2;
          options.interval = interval2;
          options.complete = startNewTimer(third);
          break;
        case "third":
          options.callback = function3;
          options.interval = interval3;
          options.complete = startNewTimer(fourth);
          break;
        case "fourth":
          options.callback = function4;
          options.interval = interval4;
          options.complete = startNewTimer(first); //Start over from function1
          break;
      }
    
      timer.callback = options.callback;
      timer.interval = options.interval;
      timer.complete = options.complete;
    
      timer.start(0);
      out("Starting timer: ".concat(timer.callback));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多