为了账号安全,请及时绑定邮箱和手机立即绑定

javascript中的寄生构造函数模式其实就是为了让工厂模式用起来像构造函数一样而刻意为之的吗?

javascript中的寄生构造函数模式其实就是为了让工厂模式用起来像构造函数一样而刻意为之的吗?

qq_花开花谢_0 2019-04-09 20:23:23
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语句,可以重写调用构造函数时返回的值。
                            
查看完整回答
反对 回复 2019-04-09
?
慕码人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链。这样问题就复杂起来。
我已有一套比较好的机制,但还不够成熟。
                            
查看完整回答
反对 回复 2019-04-09
  • 2 回答
  • 0 关注
  • 368 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号