返回可以用作函数的Javascript对象
我遇到了一个编码“测试”,它要求代码执行以下操作: 使用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
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或gettertype
函数在没有参数的情况下调用时,应该返回实际的类型行
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哦,我很抱歉,我以为你只是需要一个大致的概述。我将把这个答案留给未来的访问者。提示:你不能让对象表现得像函数,但你可以让函数表现得像对象,这是一个精心设计的答案。非常感谢。