JavaScript有条件地覆盖类方法

时间:2011-01-23 01:44:00

标签: javascript mootools

我有一个我定义的类,我在我的应用程序中使用。我有一个页面,我想更改覆盖该类的所有实例上的一些方法。这是一些代码来说明。

MyClass的-的script.js

var MyClass = new Class({
    foo: function() {
        return 1;
    },

    bar: function() {
        return this.foo() + 9;
    },
});

变化MyClass的-的script.js

MyClass.implement({
    foo: function() {
        return this.parent() * -1;
    },
});

如果我在页面上包含myclass-script.js,我应该看到:

var test = new MyClass();
test.bar() === 10; //true

如果我包含myclass-script.js然后更改-myclass-script.js,我应该看到:

var test = new MyClass();
test.bar() === 8; //true

我遇到的问题是MyClass.implement适用于MyClass的所有实例,但它不会“覆盖”该方法,它会替换它。所以this.parent()调用失败,因为该方法没有父级。如果我做MyClass.extend它不适用于我想要的,我没有看到MyClass的实例调用重写方法。

3 个答案:

答案 0 :(得分:8)

你可以存储旧版本的foo,基本上是Dimitar所做的:

var foo = MyClass.prototype.foo;
MyClass.implement('foo', function(){
    return foo.call(this) * -1;
});

或者您可以使用previous方法从MooTools More中使用Class.Refactor

Class.refactor(MyClass, {
    foo: function(){
        return this.previous() * -1;
    }
});

答案 1 :(得分:2)

不确定这是否是最佳做法,但它可以让您运行您想要的任何逻辑,或者只是在不需要时返回原始方法......

var MyClass = new Class({
    foo: function() {
        return 1;
    },
    bar: function() {
        return this.foo() + 9;
    }
});

var f = new MyClass();
console.log(f.bar()); // 10

(function() {
    var orig = MyClass.prototype.foo;
    MyClass.prototype.foo = function() {
        return orig.apply(this, arguments) * -1; 
    };
})();

console.log(f.bar()); // 8

http://www.jsfiddle.net/dimitar/cXTrD/7/

答案 2 :(得分:-1)

尝试执行以下操作:

MyClass.prototype.implement({