Подтвердить что ты не робот

Подклассификация класса с требуемыми параметрами в JavaScript

Если подкласс "класс" в JavaScript выполняется следующим образом:

var ParentClass = function() {
    // something
};


var ChildClass = function() {
    // something
};

ChildClass.prototype = new ParentClass();

... что делать, если родительский класс имеет необходимые параметры?

var ParentClass = function(requiredParameter) {
    if (typeof requiredParameter === 'undefined') {
        throw new TypeError("'requiredParameter' is required!");
    }
};


var ChildClass = function() {
    // something
};

ChildClass.prototype = new ParentClass();
// ^ Throws TypeError

Спасибо.

4b9b3361

Ответ 1

Подкласс такой, как это:

function clone (obj) {
  if (!obj) return;
  clone.prototype = obj;
  return new clone();
}

var ParentClass = function() {
    // something
};


var ChildClass = function() {
    // something
};

ChildClass.prototype = clone(ParentClass.prototype);
ChildClass.prototype.constructor = ChildClass; // if you want

Теперь вам не о чем беспокоиться, потому что вам не нужно вызывать родительский конструктор для подкласса:)

Ответ 2

Вот как это делается:

function Parent( a ) {
    this.a = a;
}

function Child( a, b ) {
    Parent.call( this, a ); // this is crucial
    this.b = b;
}

Child.prototype = Object.create( Parent.prototype );
Child.prototype.constructor = Child;

Живая демонстрация: http://jsfiddle.net/ECCgt/ (проанализируйте экземпляры в консоли)


Как вы это делаете

ChildClass.prototype = new ParentClass();

- грязный хак, который сломан и его следует избегать. Используйте Object.create для настройки отношения наследования между двумя объектами прототипа.

Вторая строка

Child.prototype.constructor = Child;

несколько необязательно. Мы исправляем свойство constructor, потому что нам нужно перезаписать Child.prototype, чтобы настроить наследование. Если вам не нравится свойство constructor, просто оставьте эту строку.

Ответ 3

Лучший способ наследования...

var inherit = (function () {
  var F = function () {}; // cache function
  return function (C, P) { // Accepts Constructor and Parent
    F.prototype = P.prototype;
    // faster prototype chain lookup than direct instantiation
    C.prototype = new F(); 
    C._super = P.prototype;
    C.prototype.constructor = C; // for checking instanceof
  };
}());