0

基本上我想这样做:

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

4

6 回答 6

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

在这里,f硬连线到 的定义中change_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);
于 2013-07-12T08:04:35.990 回答
1

容易地。这是一个例子:

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

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

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

于 2013-07-12T07:45:08.977 回答
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
    };
};
于 2013-07-12T08:57:55.077 回答
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;
};
于 2013-07-12T07:57:03.653 回答
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"
于 2013-07-12T11:35:14.437 回答
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/

于 2013-07-12T08:36:04.327 回答