Проблема с конструктором класса наследуемого класса Javascript

Я хочу создать var SuperClass = function () { this . a = 1 ; это . get = function () { вернуть это . a ;} это . init = function () { CreateStrangeThings (); } это . init (); } var SubClass = function () { this . b = 2 ; это . get = function () { вернуть это . b ;} } SubClass . prototype = новый SuperClass (); из SubClass.prototype = new SuperClass (); используя CreateStrangeThings (); s в javascript, поэтому я установил их:

var subOjbect = new SubClass();

Проблема в том, что линия SubClass.prototype = SuperClass;вызывает функцию. Я хочу, чтобы эта функция вызывалась только тогда, когда я создаю объект подкласса ( )SubClass.prototype = SuperClass;SubClass.prototype = new SuperClass();

Как преодолеть эту проблему? Может быть, я должен использовать CreateStrangeThings();? Это мудро?

РЕДАКТИРОВАТЬ:

SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;

удаляет свойство «a» из SubClass

javascript,inheritance,constructor,prototype,

1

Ответов: 1


2 принят

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

JavaScript, наследование, конструктор, прототип,
Похожие вопросы