为Javascript对象分配函数
Assigning functions to a Javascript Object
我在JS程序中有特定的图结构,其中每个节点都有与其相关的特定函数。
图结构
var g = {
"alpha_1" : getNode("alpha"),
"beta_1" : getNode("beta")
....
}
getNode()函数
var getNode = function (type) {
var obj = {
'metaType': type,
'config': Object,
'data': {
'loc': {'x': '', 'y': ''},
'args': {'keys': [], 'values': []},
'return': []
},
'in': [],
'true': [],
'false': [],
'inLineId': [],
'outLineTrueId': [],
'outLineFalseId': []
//'prototype': Object.prototype
};
switch (type) {
case 'alpha':
obj.data.args.keys.push('dataStore', 'filters', 'limit', 'data');
obj.data.args.values['dataStore'] = '';
obj.data.args.values['limit'] = 'FALSE';
obj.data.args.values['data'] = 'FALSE';
obj.data.args.values['filters'] = [];
/**
* @param valueObj :{} JSON Object with fields from, value, type
*/
obj.config.defineProperty(Object.prototype, 'setDatastore', {
value: function (valueObj) {
obj.data.args.values['dataStore'] = valueObj;
},
enumerable: false,
configurable: true,
});
/**
* @param valuesArray :[] Array with fields from, value, type
*/
obj.config.defineProperty(Object.prototype, 'setReturnValues', {
value: function (valueArray) {
obj.data.args.values['return'].push.apply([], valueArray);
},
enumerable: false,
configurable: true,
});
case 'beta':
/**
* @param key
* @param op =/>=/!=/<=/</>
* @param valueObj :{} JSON Object with fields from, value, type
* @param next
*/
obj.config.defineProperty(Object.prototype, 'addFilter', {
value: function (key, op, valueObj, next) {
obj.data.args.values['filters'].push(
{
'key': key,
'op': op,
'value': valueObj,
'next': next
}
);
},
configurable: true,
enumerable: false
});
..
}
return obj;
}
然后我尝试以以下方式访问定义的函数,
g.alpha.config.setDatastore({"a":"b"});
但它给了我一个错误。
未捕获类型错误:g.alpha_1.config.setDatastore不是函数(…)
有人能帮我解决这个问题吗?
看看Object.defineProperty():
Object.defineProperty(obj, prop, descriptor)
参数
obj
要在其上定义属性的对象。
prop
要定义或修改的属性的名称。
descriptor
正在定义或修改的属性的描述符。
obj.config.defineProperty(Object.prototype, ...)
会将属性添加到Object.prototype.
您正在寻找的是:Object.defineProperty(obj.config, ...)
您还需要将'config': Object,
更改为'config': new Object(),
var getNode = function(type) {
var obj = {
'metaType': type,
'config': new Object(),
'data': {
'loc': {
'x': '',
'y': ''
},
'args': {
'keys': [],
'values': []
},
'return': []
},
'in': [],
'true': [],
'false': [],
'inLineId': [],
'outLineTrueId': [],
'outLineFalseId': []
//'prototype': Object.prototype
};
switch (type) {
case 'alpha':
obj.data.args.keys.push('dataStore', 'filters', 'limit', 'data');
obj.data.args.values['dataStore'] = '';
obj.data.args.values['limit'] = 'FALSE';
obj.data.args.values['data'] = 'FALSE';
obj.data.args.values['filters'] = [];
/**
* @param valueObj :{} JSON Object with fields from, value, type
*/
Object.defineProperty(obj.config, 'setDatastore', {
value: function(valueObj) {
obj.data.args.values['dataStore'] = valueObj;
},
enumerable: false,
configurable: true,
});
/**
* @param valuesArray :[] Array with fields from, value, type
*/
Object.defineProperty(obj.config, 'setReturnValues', {
value: function(valueArray) {
obj.data.args.values['return'].push.apply([], valueArray);
},
enumerable: false,
configurable: true,
});
case 'beta':
/**
* @param key
* @param op =/>=/!=/<=/</>
* @param valueObj :{} JSON Object with fields from, value, type
* @param next
*/
Object.defineProperty(obj.config, 'addFilter', {
value: function(key, op, valueObj, next) {
obj.data.args.values['filters'].push({
'key': key,
'op': op,
'value': valueObj,
'next': next
});
},
configurable: true,
enumerable: false
});
}
return obj;
}
var g = {
"alpha_1": getNode("alpha"),
"alpha_2": getNode("alpha"),
"beta_1": getNode("beta")
}
g.alpha_1.config.setDatastore({
"a": "b"
});
g.alpha_2.config.setDatastore({
"a": "c"
});
//output
document.body.innerHTML = JSON.stringify(g.alpha_1.data.args.values['dataStore']);
document.body.innerHTML += "<br>" + JSON.stringify(g.alpha_2.data.args.values['dataStore']);
相关文章:
- 如何在jQuery中将链接函数分配给变量
- 如何在不使用javascript执行的情况下为函数分配参数
- Javascript从函数分配属性
- 将JavaScript函数分配给提交按钮,该按钮应有条件执行
- 将 jQuery 函数分配给变量不起作用,但包装它不起作用
- 通过参数将传递的函数分配给动态创建的输入类型的onclick事件
- 如何将printThis插件函数分配给按钮
- Javascript-将函数分配给变量dos'不能按预期工作
- 将函数分配为原型函数的属性
- JavaScript 将函数分配给变量而不运行它
- 是否将函数分配给变量的区别
- q 从 .then 函数分配给更高级别的作用域变量是否存在任何陷阱
- JavaScript 将函数分配给对象属性
- 为 jQuery 函数分配多组参数
- 在 JavaScript 中将同一函数分配给多个变量时出现性能问题
- 使用eval使用字符串输入按名称将函数分配给变量有什么风险
- 如何将函数分配给在页面加载后动态添加的元素
- 为什么在模块模式中将函数分配给变量
- 将异步函数及其回调函数分配给单个变量
- 我无法为我的 jquery 函数分配鼠标悬停事件