如果在JavaScript中继承“class”是这样的话:
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
感谢。
答案 0 :(得分:26)
这就是它的完成方式:
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
属性,请忽略该行。
答案 1 :(得分:4)
将它改为子类:
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 :(得分:2)
更好的继承方式......
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
};
}());