Проблема в том, что линия
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
.)