ES6 可以像PHP那样设置默认值。
function f(x = 1){
console.log(x)
}
f()
// 输出:1
ES5 需要自己在代码里处理
function f(x){
x = typeof x !== 'undefined' ? x : 1
console.log(x)
}
f()
// 输出:1
我认为,不是不能给父类构造函数传参数,而是传的参数最终不能起到作用。举个例子:
function Parents(ln) { this.lastName=ln} //定义父类构造函数
function Children(fn,ln) { this.firstName=fn} //定义子类,lastName 继承自父类
//原型链继承,给父类构造函数传入参数,试图用 Children 类构造函数中传入的 ln 初始化 lastName:
Children.prototype=new Parents(this ln)
//尝试建立对象实例:
var child=new Children("Bill","Gates")
//输出结果。很明显,lastNmae 并没有得到想要的值:
alert(child.firstName)//Bill
alert(child.lastName)//Undefine
这说明给父类构造函数传递参数是无效的。原因就在于原型链方式中,调用父类构造函数的代码并不在子类构造函数中,建立对象实例时给的属性值(即子类构造函数的参数)并不能影响到子类调用的父类构造函数。
当然,在继承时可以这样写:
Children.prototype=new Parents("Gates")//调用父类构造函数时给固定值
但是,这个固定的属性值必定会影响所有子类的对象实例,相当于子类构造函数“擅作主张”给所有对象实例的属性提前“赋了值”。这样写是不太符合面向对象编程的规则的。