в javascript, как новая объектная функция расширяет функцию-прототип с тем же именем? - PullRequest
0 голосов
/ 21 августа 2011

при создании объекта я хочу расширить функциональность существующей функции-прототипа новой функцией. новая функция должна вызывать исходную функцию-прототип для выполнения, но они, очевидно, находятся в одном и том же пространстве имен.

Obj = function(i,newFn) {
   this.i = i;
   if( newFn ) this.fn = newFn;
}
Obj.prototype.fn = function(a) { return a+this.i; }

o1 = new Obj1( 3, function(a) { if( a<0 ) return 0; return ORIGINAL.fn(a) } );

если ORIGINAL равен this.fn, то o1.fn становится неразрывной рекурсивной

как мне ссылаться на Obj.prototype.fn() из o1.fn()?

<Ч />

ответ, согласно @ PeterOlsen,

o1 = new Obj1( 3, function(a) { return Obj.prototype.fn.call(this,a) } );

Ответы [ 2 ]

2 голосов
/ 21 августа 2011

как мне ссылаться на Obj.prototype.fn () из o1.fn ()?

Проще говоря, ссылаться на него с помощью Obj.prototype.fn.

1 голос
/ 21 августа 2011

Вы должны быть в состоянии добраться туда, возможно, вам придется пройти немного дальше, чем вы ожидали. Попробуйте что-то вроде

Obj = function(i,newFn) {
   this.i = i;
   if( newFn ) this.fn = newFn;
}
Obj.prototype.fn = function(a) { return a+this.i; }

o1 = new Obj( 3, function(a) { if( a<0 ) return 0; return this.constructor.prototype.fn.apply(this, arguments) } );

В вашем замыкании получите прототип для конструктора, который использовался для создания этого объекта, а затем используйте .apply(), чтобы вызвать требуемый метод экземпляра, используя this и аргументы, которые вы передали.

Или, как сказал Питер Олсон, вместо this.constructor.prototype.fn вы можете использовать Obj.prototype.fn, но вам все равно нужно либо .call(), либо .apply(), чтобы убедиться, что вы выполняете метод в нужной области, в противном случае this не будет указывать на то, что, как вы думаете, должно.

...