2011-01-23 51 views
2

我有一个类,我已经定义了我在整个应用程序中使用的类。我有一个页面,我希望改变这个类的所有实例的一些方法。这里有一些代码来说明。有条件地JavaScript重写类方法

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的实例调用重写的方法。

回答

8

你可以保存旧版本的foo,基本上是贝尔巴托夫的作用:

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

或者你可以使用从MooTools的Class.Refactor更多与previous方法:

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

试着做以下几点:

MyClass.prototype.implement({ 
+0

是什么呢? – 2011-01-23 03:17:30

+0

它将该函数应用于类本身,而不是其对象实例。 – 2011-01-23 06:22:25

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/