Javascript 分组/多级原型函数

Javascript 分组/多级原型函数,javascript,node.js,function,prototype,Javascript,Node.js,Function,Prototype,在对象下执行多级函数/(将函数分组并将其设置为原型属性)是一个好主意吗? 如果没有,是否有方法对函数进行分组/排序,使它们不属于同一“级别”? 还是应该避免,还有更好的方法 注意:这是一个非常简化的示例。在我的项目中,这样的东西即使在这个简单的例子中也不起作用: //What I would want: Num = function(){ this.value = 10; } Num.prototype.calculate = {};

在对象下执行多级函数/(将函数分组并将其设置为原型属性)是一个好主意吗? 如果没有,是否有方法对函数进行分组/排序,使它们不属于同一“级别”? 还是应该避免,还有更好的方法

注意:这是一个非常简化的示例。在我的项目中,这样的东西即使在这个简单的例子中也不起作用:

    //What I would want:
    Num = function(){ 
        this.value = 10;
    }

    Num.prototype.calculate = {};
    Num.prototype.calculate.add = function(a){
        console.log(this.value + a);
    }
    Num.prototype.calculate.multi = function(a){
        console.log(this.value * a);
    }

    var myNum = new Num();

    myNum.calculate.add(1); //Error. "this" refers to Num.calculate and not Num itself.
                            //I would like to display 11

    ///////////////////////////////////////
    //My quick fix
    Num = function(){ 
        this.value = 10;
        this.calculate = new Calculate(this);
    }

    Calculate = function(parent){
        this.parent = parent;
    }

    Calculate.prototype.add = function(a){
        console.log(this.parent.value + a);
    }
    Calculate.prototype.multi = function(a){
        console.log(this.parent.value * a);
    }

    var myNum = new Num();

    myNum.calculate.add(1); //Display 11

不将
Num
定义为构造函数并使用闭包访问
变量如何

    Num.prototype.calculate = function(operation,a){
        switch(operation){
            case 'add': console.log(this.value + a); break;
            case 'multi': console.log(this.value * a); break;
        }
    }

这也使得
num
a持久对象和
value
无法从外部访问。只有
num
函数中的成员才能访问
value
。这种方法的缺点是它使
num
不可扩展,因为它不使用
this
对象。

很有趣,但不是我想要的。
 num = function(val){ 
   var value = val || 10;
   return {
     calculate: {
       add: function (a) {
         value += a;
         console.log(value);
       },
       mul: function (a) {
         value *= a;
         console.log(value);
       }
     }
   };
 };


var n = num(42);

n.calculate.add(42); //84

n.calculate.mul(2); //168