Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回可以用作函数的Javascript对象_Javascript_Oop - Fatal编程技术网

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

返回可以用作函数的Javascript对象,javascript,oop,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 D

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

使用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()和MyCatterChart()返回字符串的方法

我可以重写该对象的toString()方法,以便执行以下操作:

console.log(myBarChart + ''); // 'bar'
但在这种形式下无法获得任何有效信息:

console.log(myBarChart()); // Looking for 'bar', but never got there
基本上,当whater.type()是一个有效方法时,我无法让whater()返回字符串


有没有一种我不知道的方法可以实现这一点?

要创建一个同时充当对象的函数,可以执行以下操作:

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();
var test = myInit("Default param.");
test.prompt();
test.change("Hello!");
test.prompt();
现在,如果您想知道如何创建一个函数,该函数每次调用时都会启动一个新的对象,那么您可以实现如下内容:

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();
var test = myInit("Default param.");
test.prompt();
test.change("Hello!");
test.prompt();
在您的例子中,您希望为initate函数创建一个变量,因此您可以执行以下操作:

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();
var test = myInit("Default param.");
test.prompt();
test.change("Hello!");
test.prompt();

()

让我们先了解一下需求

  • 您需要创建一个
    图表
    函数,该函数可以返回一个具有属性
    类型
    的函数,该属性可以用作setter或getter

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

  • 默认类型应该是

  • type
    函数当使用一个参数调用时,它应该设置图表的实际
    type
    ,并且它应该以这样的方式返回一个函数,您可以再次调用它来获取
    图表。
    消息

  • 好的。现在,让我们看看如何在代码中编写这个

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

    你的答案比我的好,我的答案是:谷歌“JavaScript对象原型”。哈哈,我同意,谷歌是我们的朋友。但我不认为把它作为一个回答会减少它在StackOverflow上的使用在发布之前,我在谷歌上花了不少时间。我还花了一个小时亲自编写解决方案,查看了搜索“Javascript对象原型”时出现的许多页面。问题是,您实际上不需要使用原型来完成测试要求的内容。我缺少的是,您可以简单地向一个函数添加一个方法,该函数将作为另一个函数的返回值返回。你的回答并不能证明这一点——我已经知道你回答中的所有内容,尽管我很感激你努力提供帮助。@MichaelOryl哦,我很抱歉,我以为你只是需要一个大致的概述。我将把这个答案留给未来的访问者。提示:你不能让对象表现得像函数,但你可以让函数表现得像对象,这是一个精心设计的答案。非常感谢。