Во второй строке вы заменяете весь прототип объекта MVC экземпляром объекта MVC, и в зависимости от того, как объект инициализируется, это, скорее всего, не будет работать вообще. Первый like заменяет одну функцию, хотя в процессе он полностью нарушает эту функцию, так как вы не вызываете ее версию суперкласса, то есть вы не расширяете ее, вы действительно забиваете. Чтобы не забить, нужно сделать:
(function() {
var oldChanged = gAuto.__proto__.__proto__.changed;
function catcher(key) {
// call old version, and make sure to maintain this reference correctly
oldChanged.call(this, key);
// do your stuff here
}
gAuto.__proto__.__proto__.changed = catcher;
})();
Одно простое решение состоит в том, что у каждого объекта есть идея this
, упомянутая выше. Таким образом, changed
имеет ссылку на this
, которая будет ссылаться на объект, используемый в качестве цели вызывающей стороны (за исключением определенных ситуаций, которые здесь немного выходят за рамки). Но в основном:
var x = new MVCObject();
x.changed('hi') // this === x
Так что если вашим двум версиям нужно делать разные вещи, вы можете проверить, из какого this
вызван измененный метод, и соответствующим образом отреагировать.