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

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

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

ответ

8

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

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

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

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

+1 для class.refactor –

+0

Class.refactor именно то, что я искал –

-1

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

MyClass.prototype.implement({ 
+0

что это делает? –

+0

Он применяет функцию к самому классу, а не к экземплярам объекта. –

+0

реализовать не метод .prototype, хотя? –

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/