分组/多级原型功能

时间:2013-12-31 03:07:03

标签: javascript node.js function prototype

    //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.prototype.calculate = function(operation,a){
        switch(operation){
            case 'add': console.log(this.value + a); break;
            case 'multi': console.log(this.value * a); break;
        }
    }

1 个答案:

答案 0 :(得分:1)

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

 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

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