是否可以在调用其属性函数时修改函数本身?

时间:2013-07-12 07:41:35

标签: javascript

基本上我想这样做:

someFunction() // do something

someFunction.somePropertyFunction()

someFunction()  // Now someFunction is modified; it should now exhibit a different behaviour

这可能吗?

编辑:

我不是在寻找@Kolink的建议。基本上我想通过调用它的一个属性函数来增强函数的功能。

具体来说,我需要:1。可以访问我的属性函数中的原始函数(完全可以使用this),并且2.将新函数绑定到原始函数的名称(我不确定它是否可能)。

为了清楚起见,我无法访问我想要扩充的功能的内部定义。我想将一个函数附加到Function.prototype(以便它可以作为我想要扩充的函数的属性),然后我将调用func.augmentThis(),然后func应该是增强。但我不确定如何,因此问题:P

6 个答案:

答案 0 :(得分:1)

容易。这是一个例子:

var derp = 123;
someFunction = function() {alert(derp);};
someFunction.somePropertyFunction = function() {derp = 456;};

someFunction(); // alerts 123
someFunction.somePropertyFunction();
someFunction(); // alerts 456

好的,这是一个过于简单的例子,但是,这完全有可能。

答案 1 :(得分:1)

如果您的问题是作为属性附加到另一个函数的函数是否有办法访问它附加的函数,答案是否定的。毕竟,相同的功能可以附加到任意数量的对象功能。

所以一种方法是明确引用附加到它的函数中的“母亲”函数,并打算改变它的行为:

function f (n) {  alert (n + f.offset); }
f.offset = 0;
f.change_offset = function (i) { f.offset = i; };

f (1);                  //1
f.change_offset (100);
f (1);                  //101

此处,fchange_offset的定义紧密相连。如果这让你烦恼,或者你想要一些更通用的东西,可以编写一个小例程来将函数设置为另一个函数的属性,同时将其this绑定到附加到的函数:

function set_func_as_func_prop ( propname, func_to_set, func_to_set_on ) {
    func_to_set_on[propname] = func_to_set.bind(func_to_set_on);
}

现在你可以更普遍地编写这个函数了

function change_offset (i) {
    this.offset = i;
}

并将其设置为f或任何其他功能。

set_func_as_func_prop ("change_offset", change_offset, f);
set_func_as_func_prop ("change_offset", change_offset, g);

答案 2 :(得分:0)

排序:

function someFunction() {
    return realFunction.apply(this, arguments);
}

function someFunctionA(name) {
    return 'Hello, ' + name + '!';
}

function someFunctionB(name) {
    return 'Goodbye, ' + name + '...';
}

var realFunction = someFunctionA;

someFunction.somePropertyFunction = function () {
    realFunction = someFunctionB;
};

答案 3 :(得分:0)

当然有可能。这不是推荐,但它是可能的。例如:

function a() {
    alert("a");
}

function b() {
    alert("b");
}

function c() {
    return c.f.apply(this, arguments);
}

c.f = a;

c.toggle = function () {
    c.f = c.f === a ? b : a;
};

现在让我们测试一下:

c();        // alerts "a"
c.toggle();
c();        // alerts "b"

请参阅演示:http://jsfiddle.net/LwKM3/

答案 4 :(得分:0)

  

我想将一个函数附加到Function.prototype。然后我需要将一个新函数绑定到原始函数的名称(我不确定它是否可行)。

那确实是不可能的,你不知道是什么功能。并且您无法更改函数的内部表示,这是不可变的。

你唯一能做的就是创建一个新函数并返回它,让你的方法的调用者以某种方式使用它 - 特别是将它分配给原始变量:

somefunction = somefunction.augmentSomehow();

你的方法如下:

Function.prototype.augmentSomehow = function() {
    var origFn = this;
    return function() {
        // in here, do something special
        // which might include invoking origFn() in a different way
    };
};

答案 5 :(得分:0)

不确定这是否有帮助,但我会按以下方式实施所描述的问题:

// defined by somebody else - unknown to developer
var someFunction = function() {
    alert("this is initial behavior");
}

someFunction(); // returns "this is initial behavior"

// defines parent object on which someFunction() is called
var parentObject = this; // returns window object (as called direclty in the
// browser)

// if you are calling someFunction from some object (object.someFunction())
// it would be:
// var parentObject = object;

// augumentThis definition
someFunction.augumentThis = function() {
    var newFunction = function() {
        alert("this is changed behavior");
    };
    parentObject.someFunction.somePropertyFunction = function() {
        parentObject.someFunction = newFunction;
        parentObject.someFunction();
    };
};

someFunction.augumentThis();            // change function behavior
someFunction();                         // "this is initial behavior"
someFunction.somePropertyFunction();    // "this is changed behavior"
someFunction();                         // "this is changed behavior"
相关问题