Javascript 在forEach()中创建方法;
我正在尝试为变量res创建方法。预期结果将是res.add.wood('100')。这将使木材数量增加100Javascript 在forEach()中创建方法;,javascript,methods,foreach,Javascript,Methods,Foreach,我正在尝试为变量res创建方法。预期结果将是res.add.wood('100')。这将使木材数量增加100res.get.wheat()将获取小麦的数量 资源是['wood','smeat','gold','meat'],操作是['get','set','add','sub']。我不打算将所有这些定义如下: var resources = ['wood', 'wheat', 'gold', 'meat']; var actions = ['get', 'set', 'add', 'sub'];
res.get.wheat()
将获取小麦的数量
资源是['wood','smeat','gold','meat'],操作是['get','set','add','sub']。我不打算将所有这些定义如下:
var resources = ['wood', 'wheat', 'gold', 'meat'];
var actions = ['get', 'set', 'add', 'sub'];
var res;
function res.get.wood() {
//
}
function res.set.wood() {
//
}
// 6 more to define.....
我正在寻找一种使它更快的方法
以下代码使我能够使用res.get()
,res.set()
,res.add()
和res.sub()
:
我需要另一个循环,我尝试了以下方法,但无效:
res.forEach(function(arrayElement) {
['get', 'set', 'add', 'sub'].forEach(function(arrayInnerElement) {
res[arrayElement][arrayInnerElement] = function() {
alert(arrayInnerElement);
}
});
});
我建议这样做:
var-resources={“木头”:50,“小麦”:100,“黄金”:0,“肉”:50};
var resourceManager=(函数(资源){
功能资源(金额){
this.amount=金额| | 0;
}
Resource.prototype.get=函数(){
退还此金额;
};
Resource.prototype.set=函数(金额){
这个。金额=金额;
};
Resource.prototype.add=函数(金额){
此项。金额+=金额;
};
Resource.prototype.sub=函数(金额){
本金额-=金额;
};
var o={};
Object.keys(资源).forEach(函数(资源){
o[resource]=新资源(resources[resource]);
});
返回o;
}(资源);
var-res=资源管理器;
console.log(res.wood.get());//50
木制品套装(10);
console.log(res.wood.get());//10
res.wood.添加(5);
res.wood.sub(2);
console.log(res.wood.get());//13
只需将原型对象设置为新对象并在其中定义即可
function Item () {
this.get = function () {alert("got me");}
this.set = function () {}
this.add = function () {}
this.sub = function () {}
}
function Wood () {
}
Wood.prototype = new Item ();
那么你所要做的就是:
var newWoodItem = new Wood();
如果需要重写其中一个方法
function Wood () {
this.get = function () {alert("i am the new method.");}
}
如果您有一个正在退出的函数来处理所有操作(例如执行API调用),并且只需要一个更好的接口,那么您可以使用ES5创建
res
对象:
功能资源\行动(资源、行动、金额){
console.log(资源、操作、金额);
};
var资源=[‘木材’、‘小麦’、‘黄金’、‘肉类’];
var actions=['get','set','add','sub'];
var res=resources.reduce(函数(res,r){
res[r]=actions.reduce(函数(act,a){
行为[a]=功能(金额){
返回资源动作(r、a、金额);
};
回归法;
}, {})
返回res;
}, {});
金决议,添加(10)代码>我会用“jQuery风格”来实现,它的功能类似于$(el).css('color','red')
,如下所示:
//创建一个股票对象
var res=新股票();
//玩它
控制台.log(res.get('wood');//0
console.log(res.set('wood',10));//10
console.log(res.get('wood'));//10
console.log(res.add('wood',5));//15
console.log(res.sub('foo',5));//false(未定义的资源)
功能股票(){
var资源类型=[‘木材’、‘小麦’、‘黄金’、‘肉类’],
资源={};
init();
函数init(){
对于(var i=0;API在我看来很奇怪。实现res.add('wood',10)
,res.get('gold')
)等会简单得多。为什么不为抽象资源创建类,在res中创建相应的属性,并改用res.wood.add(100),res.wood.get()呢?还有,res.set.wood(){
是JavaScript中的语法错误。为什么会这样?如果.set
和wood
是方法,为什么会出错?@ivan调用函数时,{}
不使用。声明函数时,您需要使用函数
关键字。我认为如果项
是一个对象文字会更好。因此,基本上您正在创建所有必要的方法并运行一个大函数来处理参数,对吗?是的。假设您将操作作为API调用分派给服务器,而不是在客户端上实际添加或删除,因此您不需要单独的操作实现。如果我想设置此值。创建对象时,每个资源的数量,我应该将其放在代码中的什么位置?构造函数?我更新了答案。您现在必须传递资源
对象(资源-数量对)到resourceManager
iLife设置初始值。
function Wood () {
this.get = function () {alert("i am the new method.");}
}