function SpecialArray(){ var values = new Array(); values.push.apply(values, arguments); values.toPipedString = function(){ return this.join("|"); }; return values; } var colors = new SpecialArray("red", "blue", "green"); alert(colors.toPipedString()); //"red|blue|green"
关于javascript中的寄生构造函数模式,我觉得他和工厂模式其实就是一样的,只不过在写法上用了new这种构造函数的写法,用意是要在不扩展原生构造函数的情况下自定义一个扩展型的构造函数。
既然是扩展原生的构造函数,那么用起来当然要像个构造函数,于是就用了new这种构造函数的写法。显式的return重写了调用构造函数时返回的值,所以new不new其实最后的结果没有影响,那么写只是为了用起来像构造函数。
之所以要有这个模式是因为构造函数模式只能new出一个Object类型,不能够new出一个比如Array,类似这样是行不通的:
function SpecialArray(){ this = new Array(); this.push.apply(this, arguments); this.toPipedString = function(){ return this.join("|"); }; } var colors = new SpecialArray("red", "blue", "green"); alert(colors.toPipedString());//报错:Invalid left-hand side in assignment
大家看看我理解的对吗?
书上原话:除了使用new操作符并把使用的的包装函数叫做构造函数之外,这个模式跟工厂模式其实是一模一样的。构造函数在不返回值的情况下。默认会返回新对象实例。而通过在构造函数的末尾添加一个return语句,可以重写调用构造函数时返回的值。