我习惯于扩展JavaScript构造函数('classes'),例如here in MDN。但是如果父构造函数接受了一个参数,我就遇到了问题:
function Parent(arg){
for(var i in arg){
// do some stuff
}
}
function Descendant(arg1, arg2) {
Parent.call(this, arg1);
// do some more stuff
}
Descendant.prototype = new Parent();// problems starts from here...
正如您在我们设置原型时所看到的那样,我们在没有任何参数的情况下调用Parent()。它会导致异常,因为父对象需要参数。现在我总是检查是否提供了参数,如果没有则退出父构造函数。但它看起来不是很漂亮。如果对这种情况有一些最佳实践,那么我很有意思。
答案 0 :(得分:3)
在我看来,这里有一个基本的逻辑问题:如果你有一个构造函数使用一个或多个参数来控制它如何初始化一个新对象,那么这意味着构造函数可以创建一些变体对象。因此,如果要将该构造函数创建的对象用作另一个构造函数的原型,则必须选择所需的变体。那意味着当你构造原型对象时,你必须决定传递给父构造函数的参数。
JavaScript继承与Java或C ++等语言中的继承完全不同。有一些美化的方法使它看起来相似,但最终它是JavaScript而不是任何其他语言。具体来说,JavaScript继承不是关于扩展构造函数。相反,它是关于建立原型链以确定构造对象的对象属性的可用性。构造函数中的代码没有任何东西可以做(直接,无论如何)继承;这只是代码。它可能会影响对象属性,并且可能会对原型链进行一些假设,但它本身并不与继承机制相关联。
答案 1 :(得分:3)
我通常通过传递带有参数或配置的对象然后有条件地分配它们来处理它:
function Parent(config){
if(config){
this.a = (config.a) ? config.a: "";
this.b = (config.b) ? config.b: "";
}
}
function Descendant(config) {
Parent.call(this, config);
// do some more stuff
}
Descendant.prototype = new Parent();
var d = new Descendant({a: "something"});
JS小提琴: http://jsfiddle.net/EfP9B/