假设我有这样的功能:
function foo(){
var myValue = 5;
var myOtherValue = 1;
return {
getValue: function(){
return [myValue, myOtherValue];
}
}
}
有没有办法可以在不触及原始函数的情况下以某种方式扩展/覆盖此函数,这样当我调用getValue()
时,我得到[SOME OTHER VALUE I CHOOSE, myOtherValue]
?
如果没有,我可以在实例级别进行吗?
var myFoo = new foo();
myFoo.getValue = function(){
return [0, myOtherValue]; // how to I access myOtherValue?
}
答案 0 :(得分:3)
如果您不想修改foo,可以执行以下操作:
function foo(){
var myValue = 5;
var myOtherValue = 1;
return {
getValue: function(){
return [myValue, myOtherValue];
}
}
}
var myFoo = new foo();
//move getValue to _getValue
myFoo._getValue = myFoo.getValue;
//do custom getValue
myFoo.getValue = function(){
return [0, myFoo._getValue()[1]];
}
答案 1 :(得分:1)
你不能。
myOtherValue
仅在foo
范围内定义。
您可能需要重写为以下内容:
function foo(){
var myValue = 5;
return {
myOtherValue: 1,
getValue: function(){
return [myValue, this.myOtherValue];
}
}
}
然后你可以做:
var myFoo = new foo();
myFoo.getValue = function(){
return [0, myFoo.myOtherValue];
}
答案 2 :(得分:1)
function foo(){
var myValue = 5;
var myOtherValue = 1;
return {
getValue: function(){
return [myValue, myOtherValue];
}
}
}
var myFoo = new foo();
var storeOriginal= myFoo.getValue;
myFoo.getValue = function(){
//your code
storeOriginal();
}
答案 3 :(得分:1)
您无法访问闭包中的变量。但是,您可以定义新函数以委派给原始函数来访问它:
var myFoo = new foo();
myFoo.getValue = (function (original) {
return function(){
var val = original();
val[0] = 0;
return val;
};
}(myFoo.getValue));
以下是此解决方案的一小部分,您可以自行尝试:http://jsfiddle.net/6Ux92/1/
答案 4 :(得分:1)
function foo() {
.. original stuff ..
}
var hidden_foo = foo;
function decorator() {
var internal = hidden_foo();
// here is the proxy object
return {
getValue: function() {
return [SOME OTHER VALUE I CHOOSE, internal.getValue()[1]];
}
}
}
// overwrite the original function with our decorated version
foo = decorator;
答案 5 :(得分:0)
你可以这样做
function myFoo() {
var vals = foo().getValue();
return {
getValue : function(){
return [0, vals[1]]
}
}
}
vals[1]
显然是myOtherValue
答案 6 :(得分:0)
你可以用装饰器函数包装这个函数:
var decorator = function() {
var someNewValue = ...;
var myOtherValue = foo().getValue()[1];
return [someNewValue, myOtherValue];
}
答案 7 :(得分:0)
试试这个:
function foo(){
this.myValue = 5;
var myOtherValue = 1;
return {
getValue: function(){
return [this.myValue, myOtherValue];
}
}
}
var bar = new foo();
bar.myValue = "whatever";