如何调用函数,作为"新对象",并再次调用函数?

时间:2014-10-24 19:18:39

标签: javascript oop

作为一种学习经历,我试图创建自己的面向对象的小控制台调试脚本。我希望它类似于jQuery,因为你可以将其称为函数jQuery('div')或作为对象jQuery.ajax())。

我有下面的代码几乎正常工作。它基本上是" console.log"的别名。

我的目标是能够执行以下操作:

var log = new RadDebug;
// Create our function

log('You selected: %s', fruit_type);
// Invoke the top-level function
// Output: You selected: "Apple"

log.warn('You selected: %s', fruit_type);
// Invoke a method "warn", which displays a caution icon next to the log.
// Output: (!) You selected "Apple"

我正在处理的脚本:

function RadDebug() {
  var debug_enabled = (debug_mode && window.console && window.console.log instanceof Function);

  // If this object was already initialize, redirect the function call to the ".log()" as default
  if ( this.initialized ) {
    return this.log.apply( this, arguments );
  }
  this.initialized = true;

  this.log = function() {
    if ( !debug_enabled ) return;
    console.log.apply( console, arguments );
  };

  this.info = function() {
    if ( !debug_enabled ) return;
    console.info.apply( console, arguments );
  };

  // More methods below
}

问题:

按照您的预期调用log.warn("hello world")

致电log("hello world")告诉我TypeError: Object is not a function

问题:如何让它作为具有类似对象属性的函数运行? (就像jQuery一样)

(感谢@FelixKling已经解决了这个问题。如果要查看,最终的代码是available as a Gist。)

2 个答案:

答案 0 :(得分:8)

不要使用RadDebug作为构造函数,只需将方法附加到函数本身。

例如:

var RadDebug = (function() {
  // Some IIFE to keep debug_enabled and functions local
  var debug_enabled = (debug_mode && window.console && window.console.log instanceof Function);

  // Functions here
  function log() {
    if ( !debug_enabled ) return;
    console.log.apply( console, arguments );
  }

  function info() {
    if ( !debug_enabled ) return;
    console.info.apply( console, arguments );
  }

  // ...

  // Attach methods to "main" log function
  log.log = log;
  log.info = info;
  // ...

  // Return log function (RadDebug === log)
  return log;
}());

然后你用它作为

RadDebug('You selected: %s', fruit_type);
// same as
RadDebug.log('You selected: %s', fruit_type);

RadDebug.info('You selected: %s', fruit_type);

或别名RadDebug到您想要的任何内容(例如log)。

答案 1 :(得分:2)

函数是Javascript中的对象。您可以在RadDebug函数中返回一个函数,并将其中一个成员设置为相同的返回函数。例如:

var hello = function () {
  var fn = function () {
    console.log("Hello");
  }

  fn.hello = fn;

  return fn;
}

var sayHello = new hello();
sayHello(); // prints "Hello"
sayHello.hello(); // prints "Hello"