返回可用作函数的 Javascript 对象

Returning a Javascript object that can be used as a function

我遇到了一个编码 "test",它要求代码执行以下操作:

使用JavaScript,根据例子实现一个'chart'函数:

注意:下面使用“===”来传达预期输出。

var myBarChart = chart();
myBarChart.type() === 'line';
myBarChart.type('bar');
myBarChart.type() === 'bar';
myBarChart() === "Here's your bar chart!"; // THIS IS WHAT I CAN'T DO

var myScatterChart = chart().type('scatter');
myScatterChart() === "Here's your scatter chart!"; // THIS EITHER

chart() 对象和type() 方法的实现相对简单。我得到了所有预期的结果。然而,我无法想出的是一种将 myBarChart() 和 myScatterChart() 转换为 return 字符串的方法。

我可以重写对象的 toString() 方法,这样像下面这样的东西就可以工作了:

console.log(myBarChart + ''); // 'bar'

但没有得到任何适用于这种形式的东西:

console.log(myBarChart()); // Looking for 'bar', but never got there

基本上,我永远无法得到 whatever() 到 return 一个字符串,而 whatever.type() 是一个有效的方法。

有没有我不知道的方法可以做到这一点?

要创建一个同时充当对象的函数,您可以这样做:

var Example = function(params){
  this.params = params;
}

Example.prototype.prompt = function(){
  console.log(this.params);
}

var test = new Example("Hello, how are you?");
test.prompt();

现在,如果您要问如何创建一个函数,每次调用它时都会启动一个新的 ovject,您可以这样实现:

var Example = function(params){
  this.params = params;
}

Example.prototype.prompt = function(){
  console.log(this.params);
  return this;
}

Example.prototype.change = function(data){
  this.params = data;
  return this;
}

myInit = function(data){
  return new Example(data);
}

myInit("Hello!").prompt().change("How are you?").prompt();

在你的例子中,你想为初始化函数创建一个变量,所以你会做这样的事情:

var test = myInit("Default param.");
test.prompt();
test.change("Hello!");
test.prompt();

(JS Fiddle Example)

让我们先了解一下需求。

  1. 您需要创建一个 Chart 函数,该函数可以 return 具有 属性 type 的函数可以用作setter 或 getter.

  2. type 函数,当不带参数调用时,应该 return 实际类型。

  3. 默认类型应该是line.

  4. type 函数在使用一个参数调用时,它应该设置图表的实际 type 并且它应该 return 一个这样的函数,您可以再次调用它以获取 Here's your chart.. 消息。

好的。现在,让我们看看如何用代码编写它。

function Chart() {
    // Default type. Req 3
    var type = 'line';

    // Core function
    var func = function() {
        return "Here's your " + type + " chart!";
    };

    // Req 1
    func.type = function(value) {
        // Req 2
        if (arguments.length === 0) {
            return type;
        }
        // Req 4
        type = value;
        return func;
    }
    // Req 1
    return func;
}

测试用例:

var myBarChart = Chart();
console.assert(myBarChart.type() === 'line');
myBarChart.type('bar');
console.assert(myBarChart.type() === 'bar');
console.assert(myBarChart() === "Here's your bar chart!");

var myScatterChart = Chart().type('scatter');
console.assert(myScatterChart() === "Here's your scatter chart!");