functionSpecialArray(){varvalues=newArray();values.push.apply(values,arguments);values.toPipedString=function(){returnthis.join("|");};returnvalues;}varcolors=newSpecialArray("red","blue","green");alert(colors.toPipedString());//"red|blue|green"关于javascript中的寄生构造函数模式,我觉得他和工厂模式其实就是一样的,只不过在写法上用了new这种构造函数的写法,用意是要在不扩展原生构造函数的情况下自定义一个扩展型的构造函数。既然是扩展原生的构造函数,那么用起来当然要像个构造函数,于是就用了new这种构造函数的写法。显式的return重写了调用构造函数时返回的值,所以new不new其实最后的结果没有影响,那么写只是为了用起来像构造函数。之所以要有这个模式是因为构造函数模式只能new出一个Object类型,不能够new出一个比如Array,类似这样是行不通的:functionSpecialArray(){this=newArray();this.push.apply(this,arguments);this.toPipedString=function(){returnthis.join("|");};}varcolors=newSpecialArray("red","blue","green");alert(colors.toPipedString());//报错:Invalidleft-handsideinassignment大家看看我理解的对吗?
2 回答
慕妹3242003
TA贡献1824条经验 获得超6个赞
书上原话:除了使用new操作符并把使用的的包装函数叫做构造函数之外,这个模式跟工厂模式其实是一模一样的。构造函数在不返回值的情况下。默认会返回新对象实例。而通过在构造函数的末尾添加一个return语句,可以重写调用构造函数时返回的值。
慕码人2483693
TA贡献1860条经验 获得超9个赞
很好的问题。我不知道“寄生构造函数”这个说法呢。理论学习有些落伍了。谈谈我的实践经验吧。首先,你不能修改this。它是只读的保留字(keyword),跟for、while是一个级别的。其次,你可以在构造函数最后返回任意一个对象。它将代替this!如果你不考虑继承,那么单个类你可以这样创建:functionSpecialArray(){o=newArray();o.push.apply(o,arguments);o.toPipedString=function(){returnthis.join("|");};returno;}varcolors=newSpecialArray("red","blue","green");alert(colors.toPipedString());注:如果你写CoffeeScript,那么你会发现在正常的构造函数最后,往往必须以@结尾,否则CoffeeScript会把最后一行代码的表达式值(可能是任何东西)作为构造函数的返回值,然后就出错了……但如果你要“原装”的继承机制,那么还需要考虑构造函数对应的prototype链。这样问题就复杂起来。我已有一套比较好的机制,但还不够成熟。
添加回答
举报
0/150
提交
取消
