扩展功能

时间:2014-02-26 21:40:56

标签: javascript jquery underscore.js

假设我有这样的功能:

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?
}

8 个答案:

答案 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";