function test(){
   var customFormula={};//局部函数
   var data={a:"aaa",b:"bbb",c:"ccc"} 
   function $(n){
      return data[n];
   }
   this.CustomFormulaNameAdd=function(name,FN){
var fn="customFormula['"+name+"']="+FN;
    eval(fn);
    return name;
};
    this.getData=function(fn){
        alert(customFormula[fn]());
    };
}
var T=new test();
T.CustomFormulaNameAdd('aaa','function(){return $("a")+$("b");}');
T.getData("aaa");

解决方案 »

  1.   

    一个动态取值的方法
    值是不变的
    根据自定义的方法取出data里面的值
    就是在js里实现公式
      

  2.   


    function test(){
       var data={a:"aaa",b:"bbb",c:"ccc"};
       this.$ = function(n){
           return typeof n=='string'?data[n]:data;
       }
    }
    test.prototype.aaa = function(){
        var data = this.$();
        return data.a+data.b;
    }
    var T = new test();
    alert(T.aaa());
      

  3.   

    你还是没理解我的需求
    我取值的方法是动态的
    data是从后台取出来的
    T.CustomFormulaNameAdd('aaa','function(){return $("a")+$("b");}');
    T.CustomFormulaNameAdd('ccc','function(){return $("a")+$("c");}');
    var fielid=["aaa","ccc"];
    我可以有N种取之方式同时存在;
    怎么取我是事先是不知道的客户想怎么取让他自己去定义
    for(var i=0;i<fielid.length;i++){
       T.getData("aaa");
    }
      

  4.   

    你自己好好理解吧,我那个功能和你写的差不多,只不过用起来简单直观些
    你没看到我写的也是可以动态添加方法的?
    加一句
    test.prototype.ccc= function(){
        var data = this.$();
        return data.a-data.b;
    }
    不就有ccc方法了?
    你调用时 T['ccc']();不就行了,一样可以用字符串,有什么区别?
    甚至包装一下做成你那个样子也可以
    test.prototype.CustomFormulaNameAdd = function(name,fun){
        this[name] = fun;
    }
    test.prototype.getData = function(name){
        var data = this.$();
        return this[name].call(this,data);
    }然后调用时
    var T = new test();
    T.CustomFormulaNameAdd('ccc',function(data){
        return data.a;
    });
    T.getData('ccc');
      

  5.   

    请问
    test.prototype.CustomFormulaNameAdd=function(){}
    和this.CustomFormulaNameAdd();
    有什么区别?
      

  6.   

    请问
    test.prototype.CustomFormulaNameAdd=function(){}
    和this.CustomFormulaNameAdd=function(){};
    有什么区别?
      

  7.   

    1你的命名方式要改进
    2使用了eval要改进 
      

  8.   

    请问不用eval你怎么取到
    里面的函数?
      

  9.   

    js面向对象编程的两种方法。test.prototype.CustomFormulaNameAdd=function(){}这是采用原型模式实现。区别还是挺大的,楼主看看原型方面的一些知识就明白了。刚学JS,也是新手。
      

  10.   

    楼主这种需求可以用面向对象的思想来设计,但前提是要知道继承这种感念
    假设有一个Test父类,它有一个getData的方法需要子类去实现
    子类实现的getData方法内容可以不一样,这样也就等同于添加了一个不同的方法了这种方法看上去也简单明了,可扩展性强.
    <script type="text/javascript">
    // 父类
    function Test() {
    this.data = {a:"aaa",b:"bbb",c:"ccc"}; // 假设父类有getData方法,必须要子类实现
    if(typeof this.getData !== 'function') {
    throw new Error('没有getData方法')
    }
    }// == 子类1 ==
    function TestChild() {
    // 继承Test父类
    Test.call(this);
    }// 实现父类的getData方法
    TestChild.prototype.getData = function() {
    alert(this.data.a + this.data.b);
    }// == 子类2 ==
    function TestChild2() {
    // 继承Test父类
    Test.call(this);
    }// 实现父类的getData方法
    TestChild2.prototype.getData = function() {
    alert(this.data.b + this.data.c);
    }
    var testChild1 = new TestChild();
    var testChild2 = new TestChild2();testChild1.getData(); // aaabbb
    testChild2.getData(); // bbbccc
    </script>
      

  11.   

    如果不想用继承的方式也可以的
    <script type="text/javascript">
    function Test() {
    this.data = {a:"aaa",b:"bbb",c:"ccc"};
    // 用键值对的形式保存方法
    this.funcMap = {};

    }Test.prototype.getData = function(funcName) {
    this.funcMap[funcName].call(this);
    }
    // 添加方法
    Test.prototype.addFunc = function(funcName,func) {
    this.funcMap[funcName]  = func;
    }
    var test = new Test();test.addFunc('aaa',function(){
    alert(this.data.a + this.data.b);
    });
    test.addFunc('bbb',function(){
    alert(this.data.b + this.data.c);
    });
    test.getData('aaa');
    test.getData('bbb');
    </script>
      

  12.   

    你用了闭包 所以只能用你这样的写法 不能用后面说的 prototype定义方式T.CustomFormulaNameAdd('aaa','function(){return $("a")+$("b");}');先把需求弄清楚和解决 不要学其他几楼玩什么继承 原型 之类的
      

  13.   


    你用了闭包 所以只能用你这样的写法 不能用后面说的 prototype定义方式T.CustomFormulaNameAdd('aaa','function(){return $("a")+$("b");}');先把需求弄清楚和解决 不要学其他几楼玩什么继承 原型 之类的

    请问哪一种更消耗类存?
    我是要做数据展示,
    我将逻辑全部放到了前台
    数据量会比较大