将函数分配给Javascript对象

时间:2016-01-06 13:52:29

标签: javascript

我的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"});

但它给了我一个错误。

  

未捕获的TypeError:g.alpha_1.config.setDatastore不是函数(...)

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

看看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']);