JavaScript переопределить метод класса условно - PullRequest
3 голосов
/ 23 января 2011

У меня есть определенный класс, который я использую во всем приложении.У меня есть одна страница, где я хотел бы изменить некоторые методы во всех экземплярах класса.Вот некоторый код для иллюстрации.

myclass-script.js

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

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

change-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, а затем change-myclass-script.js, я должен увидеть:

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

Проблема Iу меня есть то, что MyClass.implement применяется ко всем экземплярам MyClass, но он не "переопределяет" метод, он заменяет его.Таким образом, вызов this.parent () завершается неудачно, потому что для этого метода нет родителя.Если я делаю MyClass.extend, он не применяется так, как я хочу, и я не вижу экземпляров MyClass, вызывающих переопределенный метод.

Ответы [ 3 ]

8 голосов
/ 23 января 2011

Вы можете хранить старую версию foo, в основном то, что делает Dimitar:

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

Или вы можете использовать Class.Refactor от MooTools More с методом previous:

Class.refactor(MyClass, {
    foo: function(){
        return this.previous() * -1;
    }
});
2 голосов
/ 23 января 2011

не уверен, что это лучший метод, но он позволит вам запустить любую логику, которую вы хотите, или просто вернуть оригинальный метод, если не требуется ...

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/

0 голосов
/ 23 января 2011

Попробуйте сделать следующее:

MyClass.prototype.implement({
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...