Подклассификация класса с требуемыми параметрами в 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
Спасибо.
Ответы
Ответ 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
};
}());