这是一个例子:
var Bidule = function() {
this.value = 8 ;
this.calc = {
plus : function(x) { return this.value + x ; },
minus : function(x) { return this.value - x ; },
square : function() { return this.value * this.value ; }
}
this.fn = {
random : {
set : function() { return this.value = random() ; },
add : function() { return this.value += random() ; }
}
}
} ;
var b = new Bidule() ;
console.log(b.value) ; // 8
console.log(b.calc.plus(4)) ; // Error : 'this.value' is undefined.
console.log(b.fn.random.add()) ; // Error : 'this.value' is undefined.
关键是要有集群方法,因为它对我来说比“b.fn_random_add()”更优雅。
修复“this”引用很容易:
var _plus = b.calc.plus ;
b.calc.plus = function() {
return _plus.apply(b, arguments) ;
} ;
console.log(b.calc.plus(4)) ; // 12
然而,以前的“this.calc.plus”和新的集合都不是 Bidule 的原型。
我想过让子对象有自己的原型,比如:
this.calc = new Bidule_calc ;
但我无法设置主对象“this”引用。
除了...还有其他方法吗:
b.calc.plus.call(b, 4) ;
...设置和调用集群方法?
在我写这篇文章时,我刚刚找到了一个可能的解决方案:
var context = this ;
Object.defineProperty(this.calc, 'value', {
get : function() {
return context.value ;
}
}) ;
但是,仍然存在无用重复函数的问题,因为原型中没有“this.calc”,并且将为 Bidule 的每个实例调用“Object.defineProperty”,因此将创建重复函数以覆盖集群方法。
编辑:我必须准确地说我们必须为所有方法使用原型:
var Bidule = function() {
this.value = 8 ;
} ;
Bidule.prototype = {
getValue : function() { return this.value ; }
} ;
不过,Bidule 的构造函数和原型有两个独立的作用域。这意味着我们不能将任何“var”共享到构造函数中以共享给方法。