//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;
}
}
答案 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
对象。