返回可以用作函数的Javascript对象

时间:2015-03-11 03:23:02

标签: javascript oop

我遇到了一个编码“测试”,要求代码执行以下操作:

使用JavaScript,根据示例实现“图表”功能:

注意:'==='用于传达预期的输出。

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()返回字符串的方法。

我可以覆盖对象的toString()方法,以便像下面这样的东西可以工作:

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

但是没有得到任何可以用这种形式起作用的东西:

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

基本上,我总是得不到什么()来返回一个字符串,而whatever.type()是一个有效的方法。

有没有办法做到这一点我还不知道?

2 个答案:

答案 0 :(得分:2)

让我们先了解要求。

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

  2. type函数在没有参数的情况下调用时,应返回实际类型。

  3. 默认类型应为line

  4. 使用一个参数调用type函数时,它应该设置图表的实际type,它应该以这样的方式返回一个函数,你可以再次调用它来获取Here's your chart..消息。

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

    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!");
    

答案 1 :(得分:1)

要创建也充当对象的函数,您可以执行以下操作:

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();

现在,如果你问的是如何创建一个你每次调用它都会启动一个新函数的函数的东西,你就可以这样做:

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();

在你的情况下,你想为initate函数创建一个变量,所以你可以这样做:

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

JS Fiddle Example

相关问题