在JavaScript中对具有必需参数的类进行子类化

时间:2011-12-10 22:39:34

标签: javascript oop

如果在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

感谢。

3 个答案:

答案 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
  };
}());