Подклассы класса с обязательными параметрами в JavaScript - PullRequest
12 голосов
/ 11 декабря 2011

Если создание подкласса «класс» в 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

Спасибо.

Ответы [ 3 ]

26 голосов
/ 11 декабря 2011

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

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, просто пропустите эту строку.

4 голосов
/ 11 декабря 2011

Подкласс это так вместо этого:

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 голосов
/ 11 декабря 2011

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

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
  };
}());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...