Проблема в том, что линия
SubClassвызывает функцию.var SubClass = function() { SuperClass.call(this); this.b = 2; this.get = function() {return this.b;} };
Да. Вот почему эта картина, несмотря на часто цитируемую, ошибочна. Другая причина заключается в том, что он игнорирует возможность var SuperClass = function () { this . a = 1 ; это . get = function () { вернуть это . a ;} это . init = function () { CreateStrangeThings (); } это . init (); }; var SubClass = function () { SuperClass . вызов ( это ); это . b = 2 ; это . get = function () { вернуть это . b ;} }; SubClass . prototype = Object . создать ( SuperClass . прототип ); SubClass . прототип . constructor = SubClass ; конструктор может потребовать аргументы.
Вместо этого создайте объект-прототип без вызова супер-конструктора:
class SuperClass {
constructor() {
this.a = 1;
this.get = function() {return this.a;};
this.init = function() {
CreateStrangeThings();
};
this.init();
}
}
class SubClass {
constructor() {
super();
this.b = 2;
this.get = function() {return this.b;};
}
}
... и также вызываем супер конструктор внутри SubClass:
SubClass.prototype = SuperClass;
Итак, все вместе мы получаем:
new SubClass
Или, конечно, используйте ES2015 и транспилер.
SuperClass.prototype
Как преодолеть эту проблему? Может быть, я должен использовать
SubClass.prototype? Это мудро?
Нет. Если вы хотите, чтобы объекты, созданные SuperClass.prototypeдля наследования свойств SuperClass, SuperClassбыли использованы в Function.prototypeкачестве своего прототипа. SuperClassне делает; прототип SuperClass- SubClass.prototypeнет prototype. (Игнорируйте имя prototypeсвойства на функциях, это не их прототип, это прототип newприсваивает объектам, созданным через new TheFunction.)