2016-10-31 3 views
0

Извините за вопрос о свалке Я новичок в js. Я хотел бы переопределить функцию f2() в D «класс». Но почему-то Fire Fox сказал мне: «слишком много рекурсии». Не могли бы вы указать мне, где происходит рекурсия и как заставить этот код работать должным образом?JS Пример наследования: слишком много рекурсии

var B = function() { 
}; 
B.prototype.f2 = function (x) { 
    return 2 * x; 
}; 

var C = function() { 
    B.call(this); 
}; 

var D = function() { 
    C.call(this); 
}; 

D.prototype.f2 = function (x) { 
    return C.prototype.f2.call(this, x) * 7; 
}; 

inherit(B, C); 
inherit(C, D); 

function inherit(Child, Parent) { 
    Child.prototype = Object.create(Parent.prototype); 
    Child.prototype.constructor = Child; 
} 

var d = new D(); 
console.log(d.f2(3)); 
+2

Мне интересно, почему вы изучаете ES5 прототип цепи так пристально (основанный на этом и по крайней мере один от на мой вопрос, который я ответил). Функция «inherit» выше устарела. Начиная с ES2015, для этого есть простой, понятный, декларативный синтаксис, и этот синтаксис может быть передан для старых сред, которые еще не поддерживают его. В этом синтаксисе гораздо проще понять. Поэтому изучение этого устаревшего способа сделать это кажется ... неоптимальным. –

+0

* (не мой dv ...) * –

+0

Большое спасибо, ваши ответы очень полезны! Я учился в классическом стиле oop в js, и нас попросили реализовать его двумя способами: ES5 и ES2015. Но я понимаю, что вы говорите, это имеет смысл и делает мир js, о котором я только что знаком, более ясен. –

ответ

4

Две проблемы:

  1. Вам нужно настроить XYZ.prototype объекты перед тем вы пытаетесь добавить свойства к ним. Поскольку ваша функция inherit создает их, вы должны убедиться, что делаете что-то в правильном порядке.

  2. У вас есть заказ родителя и ребенка назад в ваших вызовах inherit. Это inherit(child, parent), а не inherit(parent, child).

var B = function() { 
 
}; 
 
B.prototype.f2 = function (x) { 
 
    return 2 * x; 
 
}; 
 

 
var C = function() { 
 
    B.call(this); 
 
}; 
 
inherit(C, B);   // *** Moved and updated 
 

 
var D = function() { 
 
    C.call(this); 
 
}; 
 
inherit(D, C);   // *** Moved and updated 
 

 
D.prototype.f2 = function (x) { 
 
    return C.prototype.f2.call(this, x) * 7; 
 
}; 
 

 
function inherit(Child, Parent) { 
 
    Child.prototype = Object.create(Parent.prototype); 
 
    Child.prototype.constructor = Child; 
 
} 
 

 
var d = new D(); 
 
console.log(d.f2(3));

версия ES2015, для сравнения:

class B { 
 
    f2(x) { 
 
    return 2 * x; 
 
    } 
 
} 
 

 
class C extends B { 
 
} 
 

 
class D extends C { 
 
    f2(x) { 
 
    return super.f2(x) * 7; 
 
    } 
 
} 
 

 
const d = new D(); 
 
console.log(d.f2(3));